eaiovnaovbqoebvqoeavibavo PK8hZ`ffinclude/nghttp2/nghttp2.hnu[/* * nghttp2 - HTTP/2 C Library * * Copyright (c) 2013, 2014 Tatsuhiro Tsujikawa * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef NGHTTP2_H #define NGHTTP2_H /* Define WIN32 when build target is Win32 API (borrowed from libcurl) */ #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) # define WIN32 #endif /* Compatibility for non-Clang compilers */ #ifndef __has_declspec_attribute # define __has_declspec_attribute(x) 0 #endif #ifdef __cplusplus extern "C" { #endif #include #if defined(_MSC_VER) && (_MSC_VER < 1800) /* MSVC < 2013 does not have inttypes.h because it is not C99 compliant. See compiler macros and version number in https://sourceforge.net/p/predef/wiki/Compilers/ */ # include #else /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */ # include #endif /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */ #include #include #include #include #ifdef NGHTTP2_STATICLIB # define NGHTTP2_EXTERN #elif defined(WIN32) || (__has_declspec_attribute(dllexport) && \ __has_declspec_attribute(dllimport)) # ifdef BUILDING_NGHTTP2 # define NGHTTP2_EXTERN __declspec(dllexport) # else /* !BUILDING_NGHTTP2 */ # define NGHTTP2_EXTERN __declspec(dllimport) # endif /* !BUILDING_NGHTTP2 */ #else /* !defined(WIN32) */ # ifdef BUILDING_NGHTTP2 # define NGHTTP2_EXTERN __attribute__((visibility("default"))) # else /* !BUILDING_NGHTTP2 */ # define NGHTTP2_EXTERN # endif /* !BUILDING_NGHTTP2 */ #endif /* !defined(WIN32) */ /** * @typedef * * :type:`nghttp2_ssize` is a signed counterpart of size_t. */ typedef ptrdiff_t nghttp2_ssize; /** * @macro * * The protocol version identification string of this library * supports. This identifier is used if HTTP/2 is used over TLS. */ #define NGHTTP2_PROTO_VERSION_ID "h2" /** * @macro * * The length of :macro:`NGHTTP2_PROTO_VERSION_ID`. */ #define NGHTTP2_PROTO_VERSION_ID_LEN 2 /** * @macro * * The serialized form of ALPN protocol identifier this library * supports. Notice that first byte is the length of following * protocol identifier. This is the same wire format of `TLS ALPN * extension `_. This is useful * to process incoming ALPN tokens in wire format. */ #define NGHTTP2_PROTO_ALPN "\x2h2" /** * @macro * * The length of :macro:`NGHTTP2_PROTO_ALPN`. */ #define NGHTTP2_PROTO_ALPN_LEN (sizeof(NGHTTP2_PROTO_ALPN) - 1) /** * @macro * * The protocol version identification string of this library * supports. This identifier is used if HTTP/2 is used over cleartext * TCP. */ #define NGHTTP2_CLEARTEXT_PROTO_VERSION_ID "h2c" /** * @macro * * The length of :macro:`NGHTTP2_CLEARTEXT_PROTO_VERSION_ID`. */ #define NGHTTP2_CLEARTEXT_PROTO_VERSION_ID_LEN 3 struct nghttp2_session; /** * @struct * * The primary structure to hold the resources needed for a HTTP/2 * session. The details of this structure are intentionally hidden * from the public API. */ typedef struct nghttp2_session nghttp2_session; /** * @macro * * The age of :type:`nghttp2_info` */ #define NGHTTP2_VERSION_AGE 1 /** * @struct * * This struct is what `nghttp2_version()` returns. It holds * information about the particular nghttp2 version. */ typedef struct { /** * Age of this struct. This instance of nghttp2 sets it to * :macro:`NGHTTP2_VERSION_AGE` but a future version may bump it and * add more struct fields at the bottom */ int age; /** * the :macro:`NGHTTP2_VERSION_NUM` number (since age ==1) */ int version_num; /** * points to the :macro:`NGHTTP2_VERSION` string (since age ==1) */ const char *version_str; /** * points to the :macro:`NGHTTP2_PROTO_VERSION_ID` string this * instance implements (since age ==1) */ const char *proto_str; /* -------- the above fields all exist when age == 1 */ } nghttp2_info; /** * @macro * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. * * The default weight of stream dependency. */ #define NGHTTP2_DEFAULT_WEIGHT 16 /** * @macro * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. * * The maximum weight of stream dependency. */ #define NGHTTP2_MAX_WEIGHT 256 /** * @macro * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. * * The minimum weight of stream dependency. */ #define NGHTTP2_MIN_WEIGHT 1 /** * @macro * * The maximum window size */ #define NGHTTP2_MAX_WINDOW_SIZE ((int32_t)((1U << 31) - 1)) /** * @macro * * The initial window size for stream level flow control. */ #define NGHTTP2_INITIAL_WINDOW_SIZE ((1 << 16) - 1) /** * @macro * * The initial window size for connection level flow control. */ #define NGHTTP2_INITIAL_CONNECTION_WINDOW_SIZE ((1 << 16) - 1) /** * @macro * * The default header table size. */ #define NGHTTP2_DEFAULT_HEADER_TABLE_SIZE (1 << 12) /** * @macro * * The client magic string, which is the first 24 bytes byte string of * client connection preface. */ #define NGHTTP2_CLIENT_MAGIC "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" /** * @macro * * The length of :macro:`NGHTTP2_CLIENT_MAGIC`. */ #define NGHTTP2_CLIENT_MAGIC_LEN 24 /** * @macro * * The default max number of settings per SETTINGS frame */ #define NGHTTP2_DEFAULT_MAX_SETTINGS 32 /** * @enum * * Error codes used in this library. The code range is [-999, -500], * inclusive. The following values are defined: */ typedef enum { /** * Invalid argument passed. */ NGHTTP2_ERR_INVALID_ARGUMENT = -501, /** * Out of buffer space. */ NGHTTP2_ERR_BUFFER_ERROR = -502, /** * The specified protocol version is not supported. */ NGHTTP2_ERR_UNSUPPORTED_VERSION = -503, /** * Used as a return value from :type:`nghttp2_send_callback2`, * :type:`nghttp2_recv_callback` and * :type:`nghttp2_send_data_callback` to indicate that the operation * would block. */ NGHTTP2_ERR_WOULDBLOCK = -504, /** * General protocol error */ NGHTTP2_ERR_PROTO = -505, /** * The frame is invalid. */ NGHTTP2_ERR_INVALID_FRAME = -506, /** * The peer performed a shutdown on the connection. */ NGHTTP2_ERR_EOF = -507, /** * Used as a return value from * :func:`nghttp2_data_source_read_callback2` to indicate that data * transfer is postponed. See * :func:`nghttp2_data_source_read_callback2` for details. */ NGHTTP2_ERR_DEFERRED = -508, /** * Stream ID has reached the maximum value. Therefore no stream ID * is available. */ NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE = -509, /** * The stream is already closed; or the stream ID is invalid. */ NGHTTP2_ERR_STREAM_CLOSED = -510, /** * RST_STREAM has been added to the outbound queue. The stream is * in closing state. */ NGHTTP2_ERR_STREAM_CLOSING = -511, /** * The transmission is not allowed for this stream (e.g., a frame * with END_STREAM flag set has already sent). */ NGHTTP2_ERR_STREAM_SHUT_WR = -512, /** * The stream ID is invalid. */ NGHTTP2_ERR_INVALID_STREAM_ID = -513, /** * The state of the stream is not valid (e.g., DATA cannot be sent * to the stream if response HEADERS has not been sent). */ NGHTTP2_ERR_INVALID_STREAM_STATE = -514, /** * Another DATA frame has already been deferred. */ NGHTTP2_ERR_DEFERRED_DATA_EXIST = -515, /** * Starting new stream is not allowed (e.g., GOAWAY has been sent * and/or received). */ NGHTTP2_ERR_START_STREAM_NOT_ALLOWED = -516, /** * GOAWAY has already been sent. */ NGHTTP2_ERR_GOAWAY_ALREADY_SENT = -517, /** * The received frame contains the invalid header block (e.g., There * are duplicate header names; or the header names are not encoded * in US-ASCII character set and not lower cased; or the header name * is zero-length string; or the header value contains multiple * in-sequence NUL bytes). */ NGHTTP2_ERR_INVALID_HEADER_BLOCK = -518, /** * Indicates that the context is not suitable to perform the * requested operation. */ NGHTTP2_ERR_INVALID_STATE = -519, /** * The user callback function failed due to the temporal error. */ NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE = -521, /** * The length of the frame is invalid, either too large or too small. */ NGHTTP2_ERR_FRAME_SIZE_ERROR = -522, /** * Header block inflate/deflate error. */ NGHTTP2_ERR_HEADER_COMP = -523, /** * Flow control error */ NGHTTP2_ERR_FLOW_CONTROL = -524, /** * Insufficient buffer size given to function. */ NGHTTP2_ERR_INSUFF_BUFSIZE = -525, /** * Callback was paused by the application */ NGHTTP2_ERR_PAUSE = -526, /** * There are too many in-flight SETTING frame and no more * transmission of SETTINGS is allowed. */ NGHTTP2_ERR_TOO_MANY_INFLIGHT_SETTINGS = -527, /** * The server push is disabled. */ NGHTTP2_ERR_PUSH_DISABLED = -528, /** * DATA or HEADERS frame for a given stream has been already * submitted and has not been fully processed yet. Application * should wait for the transmission of the previously submitted * frame before submitting another. */ NGHTTP2_ERR_DATA_EXIST = -529, /** * The current session is closing due to a connection error or * `nghttp2_session_terminate_session()` is called. */ NGHTTP2_ERR_SESSION_CLOSING = -530, /** * Invalid HTTP header field was received and stream is going to be * closed. */ NGHTTP2_ERR_HTTP_HEADER = -531, /** * Violation in HTTP messaging rule. */ NGHTTP2_ERR_HTTP_MESSAGING = -532, /** * Stream was refused. */ NGHTTP2_ERR_REFUSED_STREAM = -533, /** * Unexpected internal error, but recovered. */ NGHTTP2_ERR_INTERNAL = -534, /** * Indicates that a processing was canceled. */ NGHTTP2_ERR_CANCEL = -535, /** * When a local endpoint expects to receive SETTINGS frame, it * receives an other type of frame. */ NGHTTP2_ERR_SETTINGS_EXPECTED = -536, /** * When a local endpoint receives too many settings entries * in a single SETTINGS frame. */ NGHTTP2_ERR_TOO_MANY_SETTINGS = -537, /** * The errors < :enum:`nghttp2_error.NGHTTP2_ERR_FATAL` mean that * the library is under unexpected condition and processing was * terminated (e.g., out of memory). If application receives this * error code, it must stop using that :type:`nghttp2_session` * object and only allowed operation for that object is deallocate * it using `nghttp2_session_del()`. */ NGHTTP2_ERR_FATAL = -900, /** * Out of memory. This is a fatal error. */ NGHTTP2_ERR_NOMEM = -901, /** * The user callback function failed. This is a fatal error. */ NGHTTP2_ERR_CALLBACK_FAILURE = -902, /** * Invalid client magic (see :macro:`NGHTTP2_CLIENT_MAGIC`) was * received and further processing is not possible. */ NGHTTP2_ERR_BAD_CLIENT_MAGIC = -903, /** * Possible flooding by peer was detected in this HTTP/2 session. * Flooding is measured by how many PING and SETTINGS frames with * ACK flag set are queued for transmission. These frames are * response for the peer initiated frames, and peer can cause memory * exhaustion on server side to send these frames forever and does * not read network. */ NGHTTP2_ERR_FLOODED = -904, /** * When a local endpoint receives too many CONTINUATION frames * following a HEADER frame. */ NGHTTP2_ERR_TOO_MANY_CONTINUATIONS = -905, } nghttp2_error; /** * @struct * * The object representing single contiguous buffer. */ typedef struct { /** * The pointer to the buffer. */ uint8_t *base; /** * The length of the buffer. */ size_t len; } nghttp2_vec; struct nghttp2_rcbuf; /** * @struct * * The object representing reference counted buffer. The details of * this structure are intentionally hidden from the public API. */ typedef struct nghttp2_rcbuf nghttp2_rcbuf; /** * @function * * Increments the reference count of |rcbuf| by 1. */ NGHTTP2_EXTERN void nghttp2_rcbuf_incref(nghttp2_rcbuf *rcbuf); /** * @function * * Decrements the reference count of |rcbuf| by 1. If the reference * count becomes zero, the object pointed by |rcbuf| will be freed. * In this case, application must not use |rcbuf| again. */ NGHTTP2_EXTERN void nghttp2_rcbuf_decref(nghttp2_rcbuf *rcbuf); /** * @function * * Returns the underlying buffer managed by |rcbuf|. */ NGHTTP2_EXTERN nghttp2_vec nghttp2_rcbuf_get_buf(nghttp2_rcbuf *rcbuf); /** * @function * * Returns nonzero if the underlying buffer is statically allocated, * and 0 otherwise. This can be useful for language bindings that wish * to avoid creating duplicate strings for these buffers. */ NGHTTP2_EXTERN int nghttp2_rcbuf_is_static(const nghttp2_rcbuf *rcbuf); /** * @enum * * The flags for header field name/value pair. */ typedef enum { /** * No flag set. */ NGHTTP2_NV_FLAG_NONE = 0, /** * Indicates that this name/value pair must not be indexed ("Literal * Header Field never Indexed" representation must be used in HPACK * encoding). Other implementation calls this bit as "sensitive". */ NGHTTP2_NV_FLAG_NO_INDEX = 0x01, /** * This flag is set solely by application. If this flag is set, the * library does not make a copy of header field name. This could * improve performance. */ NGHTTP2_NV_FLAG_NO_COPY_NAME = 0x02, /** * This flag is set solely by application. If this flag is set, the * library does not make a copy of header field value. This could * improve performance. */ NGHTTP2_NV_FLAG_NO_COPY_VALUE = 0x04 } nghttp2_nv_flag; /** * @struct * * The name/value pair, which mainly used to represent header fields. */ typedef struct { /** * The |name| byte string. If this struct is presented from library * (e.g., :type:`nghttp2_on_frame_recv_callback`), |name| is * guaranteed to be NULL-terminated. For some callbacks * (:type:`nghttp2_before_frame_send_callback`, * :type:`nghttp2_on_frame_send_callback`, and * :type:`nghttp2_on_frame_not_send_callback`), it may not be * NULL-terminated if header field is passed from application with * the flag :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME`). * When application is constructing this struct, |name| is not * required to be NULL-terminated. */ uint8_t *name; /** * The |value| byte string. If this struct is presented from * library (e.g., :type:`nghttp2_on_frame_recv_callback`), |value| * is guaranteed to be NULL-terminated. For some callbacks * (:type:`nghttp2_before_frame_send_callback`, * :type:`nghttp2_on_frame_send_callback`, and * :type:`nghttp2_on_frame_not_send_callback`), it may not be * NULL-terminated if header field is passed from application with * the flag :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE`). * When application is constructing this struct, |value| is not * required to be NULL-terminated. */ uint8_t *value; /** * The length of the |name|, excluding terminating NULL. */ size_t namelen; /** * The length of the |value|, excluding terminating NULL. */ size_t valuelen; /** * Bitwise OR of one or more of :type:`nghttp2_nv_flag`. */ uint8_t flags; } nghttp2_nv; /** * @enum * * The frame types in HTTP/2 specification. */ typedef enum { /** * The DATA frame. */ NGHTTP2_DATA = 0, /** * The HEADERS frame. */ NGHTTP2_HEADERS = 0x01, /** * The PRIORITY frame. */ NGHTTP2_PRIORITY = 0x02, /** * The RST_STREAM frame. */ NGHTTP2_RST_STREAM = 0x03, /** * The SETTINGS frame. */ NGHTTP2_SETTINGS = 0x04, /** * The PUSH_PROMISE frame. */ NGHTTP2_PUSH_PROMISE = 0x05, /** * The PING frame. */ NGHTTP2_PING = 0x06, /** * The GOAWAY frame. */ NGHTTP2_GOAWAY = 0x07, /** * The WINDOW_UPDATE frame. */ NGHTTP2_WINDOW_UPDATE = 0x08, /** * The CONTINUATION frame. This frame type won't be passed to any * callbacks because the library processes this frame type and its * preceding HEADERS/PUSH_PROMISE as a single frame. */ NGHTTP2_CONTINUATION = 0x09, /** * The ALTSVC frame, which is defined in `RFC 7383 * `_. */ NGHTTP2_ALTSVC = 0x0a, /** * The ORIGIN frame, which is defined by `RFC 8336 * `_. */ NGHTTP2_ORIGIN = 0x0c, /** * The PRIORITY_UPDATE frame, which is defined by :rfc:`9218`. */ NGHTTP2_PRIORITY_UPDATE = 0x10 } nghttp2_frame_type; /** * @enum * * The flags for HTTP/2 frames. This enum defines all flags for all * frames. */ typedef enum { /** * No flag set. */ NGHTTP2_FLAG_NONE = 0, /** * The END_STREAM flag. */ NGHTTP2_FLAG_END_STREAM = 0x01, /** * The END_HEADERS flag. */ NGHTTP2_FLAG_END_HEADERS = 0x04, /** * The ACK flag. */ NGHTTP2_FLAG_ACK = 0x01, /** * The PADDED flag. */ NGHTTP2_FLAG_PADDED = 0x08, /** * The PRIORITY flag. */ NGHTTP2_FLAG_PRIORITY = 0x20 } nghttp2_flag; /** * @enum * The SETTINGS ID. */ typedef enum { /** * SETTINGS_HEADER_TABLE_SIZE */ NGHTTP2_SETTINGS_HEADER_TABLE_SIZE = 0x01, /** * SETTINGS_ENABLE_PUSH */ NGHTTP2_SETTINGS_ENABLE_PUSH = 0x02, /** * SETTINGS_MAX_CONCURRENT_STREAMS */ NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS = 0x03, /** * SETTINGS_INITIAL_WINDOW_SIZE */ NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE = 0x04, /** * SETTINGS_MAX_FRAME_SIZE */ NGHTTP2_SETTINGS_MAX_FRAME_SIZE = 0x05, /** * SETTINGS_MAX_HEADER_LIST_SIZE */ NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE = 0x06, /** * SETTINGS_ENABLE_CONNECT_PROTOCOL * (`RFC 8441 `_) */ NGHTTP2_SETTINGS_ENABLE_CONNECT_PROTOCOL = 0x08, /** * SETTINGS_NO_RFC7540_PRIORITIES (:rfc:`9218`) */ NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES = 0x09 } nghttp2_settings_id; /* Note: If we add SETTINGS, update the capacity of NGHTTP2_INBOUND_NUM_IV as well */ /** * @macro * * .. warning:: * * Deprecated. The initial max concurrent streams is 0xffffffffu. * * Default maximum number of incoming concurrent streams. Use * `nghttp2_submit_settings()` with * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS` * to change the maximum number of incoming concurrent streams. * * .. note:: * * The maximum number of outgoing concurrent streams is 100 by * default. */ #define NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS ((1U << 31) - 1) /** * @enum * The status codes for the RST_STREAM and GOAWAY frames. */ typedef enum { /** * No errors. */ NGHTTP2_NO_ERROR = 0x00, /** * PROTOCOL_ERROR */ NGHTTP2_PROTOCOL_ERROR = 0x01, /** * INTERNAL_ERROR */ NGHTTP2_INTERNAL_ERROR = 0x02, /** * FLOW_CONTROL_ERROR */ NGHTTP2_FLOW_CONTROL_ERROR = 0x03, /** * SETTINGS_TIMEOUT */ NGHTTP2_SETTINGS_TIMEOUT = 0x04, /** * STREAM_CLOSED */ NGHTTP2_STREAM_CLOSED = 0x05, /** * FRAME_SIZE_ERROR */ NGHTTP2_FRAME_SIZE_ERROR = 0x06, /** * REFUSED_STREAM */ NGHTTP2_REFUSED_STREAM = 0x07, /** * CANCEL */ NGHTTP2_CANCEL = 0x08, /** * COMPRESSION_ERROR */ NGHTTP2_COMPRESSION_ERROR = 0x09, /** * CONNECT_ERROR */ NGHTTP2_CONNECT_ERROR = 0x0a, /** * ENHANCE_YOUR_CALM */ NGHTTP2_ENHANCE_YOUR_CALM = 0x0b, /** * INADEQUATE_SECURITY */ NGHTTP2_INADEQUATE_SECURITY = 0x0c, /** * HTTP_1_1_REQUIRED */ NGHTTP2_HTTP_1_1_REQUIRED = 0x0d } nghttp2_error_code; /** * @struct * The frame header. */ typedef struct { /** * The length field of this frame, excluding frame header. */ size_t length; /** * The stream identifier (aka, stream ID) */ int32_t stream_id; /** * The type of this frame. See `nghttp2_frame_type`. */ uint8_t type; /** * The flags. */ uint8_t flags; /** * Reserved bit in frame header. Currently, this is always set to 0 * and application should not expect something useful in here. */ uint8_t reserved; } nghttp2_frame_hd; /** * @union * * This union represents the some kind of data source passed to * :type:`nghttp2_data_source_read_callback2`. */ typedef union { /** * The integer field, suitable for a file descriptor. */ int fd; /** * The pointer to an arbitrary object. */ void *ptr; } nghttp2_data_source; /** * @enum * * The flags used to set in |data_flags| output parameter in * :type:`nghttp2_data_source_read_callback2`. */ typedef enum { /** * No flag set. */ NGHTTP2_DATA_FLAG_NONE = 0, /** * Indicates EOF was sensed. */ NGHTTP2_DATA_FLAG_EOF = 0x01, /** * Indicates that END_STREAM flag must not be set even if * NGHTTP2_DATA_FLAG_EOF is set. Usually this flag is used to send * trailer fields with `nghttp2_submit_request2()` or * `nghttp2_submit_response2()`. */ NGHTTP2_DATA_FLAG_NO_END_STREAM = 0x02, /** * Indicates that application will send complete DATA frame in * :type:`nghttp2_send_data_callback`. */ NGHTTP2_DATA_FLAG_NO_COPY = 0x04 } nghttp2_data_flag; #ifndef NGHTTP2_NO_SSIZE_T /** * @functypedef * * .. warning:: * * Deprecated. Use :type:`nghttp2_data_source_read_callback2` * instead. * * Callback function invoked when the library wants to read data from * the |source|. The read data is sent in the stream |stream_id|. * The implementation of this function must read at most |length| * bytes of data from |source| (or possibly other places) and store * them in |buf| and return number of data stored in |buf|. If EOF is * reached, set :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_EOF` flag * in |*data_flags|. * * Sometime it is desirable to avoid copying data into |buf| and let * application to send data directly. To achieve this, set * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_COPY` to * |*data_flags| (and possibly other flags, just like when we do * copy), and return the number of bytes to send without copying data * into |buf|. The library, seeing * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_COPY`, will invoke * :type:`nghttp2_send_data_callback`. The application must send * complete DATA frame in that callback. * * If this callback is set by `nghttp2_submit_request()`, * `nghttp2_submit_response()` or `nghttp2_submit_headers()` and * `nghttp2_submit_data()` with flag parameter * :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM` set, and * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_EOF` flag is set to * |*data_flags|, DATA frame will have END_STREAM flag set. Usually, * this is expected behaviour and all are fine. One exception is send * trailer fields. You cannot send trailer fields after sending frame * with END_STREAM set. To avoid this problem, one can set * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_END_STREAM` along * with :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_EOF` to signal the * library not to set END_STREAM in DATA frame. Then application can * use `nghttp2_submit_trailer()` to send trailer fields. * `nghttp2_submit_trailer()` can be called inside this callback. * * If the application wants to postpone DATA frames (e.g., * asynchronous I/O, or reading data blocks for long time), it is * achieved by returning :enum:`nghttp2_error.NGHTTP2_ERR_DEFERRED` * without reading any data in this invocation. The library removes * DATA frame from the outgoing queue temporarily. To move back * deferred DATA frame to outgoing queue, call * `nghttp2_session_resume_data()`. * * By default, |length| is limited to 16KiB at maximum. If peer * allows larger frames, application can enlarge transmission buffer * size. See :type:`nghttp2_data_source_read_length_callback` for * more details. * * If the application just wants to return from * `nghttp2_session_send()` or `nghttp2_session_mem_send()` without * sending anything, return :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE`. * * In case of error, there are 2 choices. Returning * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE` will * close the stream by issuing RST_STREAM with * :enum:`nghttp2_error_code.NGHTTP2_INTERNAL_ERROR`. If a different * error code is desirable, use `nghttp2_submit_rst_stream()` with a * desired error code and then return * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`. * Returning :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` will * signal the entire session failure. */ typedef ssize_t (*nghttp2_data_source_read_callback)( nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length, uint32_t *data_flags, nghttp2_data_source *source, void *user_data); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @functypedef * * Callback function invoked when the library wants to read data from * the |source|. The read data is sent in the stream |stream_id|. * The implementation of this function must read at most |length| * bytes of data from |source| (or possibly other places) and store * them in |buf| and return number of data stored in |buf|. If EOF is * reached, set :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_EOF` flag * in |*data_flags|. * * Sometime it is desirable to avoid copying data into |buf| and let * application to send data directly. To achieve this, set * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_COPY` to * |*data_flags| (and possibly other flags, just like when we do * copy), and return the number of bytes to send without copying data * into |buf|. The library, seeing * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_COPY`, will invoke * :type:`nghttp2_send_data_callback`. The application must send * complete DATA frame in that callback. * * If this callback is set by `nghttp2_submit_request2()`, * `nghttp2_submit_response2()` or `nghttp2_submit_headers()` and * `nghttp2_submit_data2()` with flag parameter * :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM` set, and * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_EOF` flag is set to * |*data_flags|, DATA frame will have END_STREAM flag set. Usually, * this is expected behaviour and all are fine. One exception is send * trailer fields. You cannot send trailer fields after sending frame * with END_STREAM set. To avoid this problem, one can set * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_END_STREAM` along * with :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_EOF` to signal the * library not to set END_STREAM in DATA frame. Then application can * use `nghttp2_submit_trailer()` to send trailer fields. * `nghttp2_submit_trailer()` can be called inside this callback. * * If the application wants to postpone DATA frames (e.g., * asynchronous I/O, or reading data blocks for long time), it is * achieved by returning :enum:`nghttp2_error.NGHTTP2_ERR_DEFERRED` * without reading any data in this invocation. The library removes * DATA frame from the outgoing queue temporarily. To move back * deferred DATA frame to outgoing queue, call * `nghttp2_session_resume_data()`. * * By default, |length| is limited to 16KiB at maximum. If peer * allows larger frames, application can enlarge transmission buffer * size. See :type:`nghttp2_data_source_read_length_callback` for * more details. * * If the application just wants to return from * `nghttp2_session_send()` or `nghttp2_session_mem_send2()` without * sending anything, return :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE`. * * In case of error, there are 2 choices. Returning * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE` will * close the stream by issuing RST_STREAM with * :enum:`nghttp2_error_code.NGHTTP2_INTERNAL_ERROR`. If a different * error code is desirable, use `nghttp2_submit_rst_stream()` with a * desired error code and then return * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`. * Returning :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` will * signal the entire session failure. */ typedef nghttp2_ssize (*nghttp2_data_source_read_callback2)( nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length, uint32_t *data_flags, nghttp2_data_source *source, void *user_data); #ifndef NGHTTP2_NO_SSIZE_T /** * @struct * * .. warning:: * * Deprecated. Use :type:`nghttp2_data_provider2` instead. * * This struct represents the data source and the way to read a chunk * of data from it. */ typedef struct { /** * The data source. */ nghttp2_data_source source; /** * The callback function to read a chunk of data from the |source|. */ nghttp2_data_source_read_callback read_callback; } nghttp2_data_provider; #endif /* NGHTTP2_NO_SSIZE_T */ /** * @struct * * This struct represents the data source and the way to read a chunk * of data from it. */ typedef struct { /** * The data source. */ nghttp2_data_source source; /** * The callback function to read a chunk of data from the |source|. */ nghttp2_data_source_read_callback2 read_callback; } nghttp2_data_provider2; /** * @struct * * The DATA frame. The received data is delivered via * :type:`nghttp2_on_data_chunk_recv_callback`. */ typedef struct { nghttp2_frame_hd hd; /** * The length of the padding in this frame. This includes PAD_HIGH * and PAD_LOW. */ size_t padlen; } nghttp2_data; /** * @enum * * The category of HEADERS, which indicates the role of the frame. In * HTTP/2 spec, request, response, push response and other arbitrary * headers (e.g., trailer fields) are all called just HEADERS. To * give the application the role of incoming HEADERS frame, we define * several categories. */ typedef enum { /** * The HEADERS frame is opening new stream, which is analogous to * SYN_STREAM in SPDY. */ NGHTTP2_HCAT_REQUEST = 0, /** * The HEADERS frame is the first response headers, which is * analogous to SYN_REPLY in SPDY. */ NGHTTP2_HCAT_RESPONSE = 1, /** * The HEADERS frame is the first headers sent against reserved * stream. */ NGHTTP2_HCAT_PUSH_RESPONSE = 2, /** * The HEADERS frame which does not apply for the above categories, * which is analogous to HEADERS in SPDY. If non-final response * (e.g., status 1xx) is used, final response HEADERS frame will be * categorized here. */ NGHTTP2_HCAT_HEADERS = 3 } nghttp2_headers_category; /** * @struct * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. * * The structure to specify stream dependency. */ typedef struct { /** * The stream ID of the stream to depend on. Specifying 0 makes * stream not depend any other stream. */ int32_t stream_id; /** * The weight of this dependency. */ int32_t weight; /** * nonzero means exclusive dependency */ uint8_t exclusive; } nghttp2_priority_spec; /** * @struct * * The HEADERS frame. It has the following members: */ typedef struct { /** * The frame header. */ nghttp2_frame_hd hd; /** * The length of the padding in this frame. This includes PAD_HIGH * and PAD_LOW. */ size_t padlen; /** * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. * * The priority specification */ nghttp2_priority_spec pri_spec; /** * The name/value pairs. */ nghttp2_nv *nva; /** * The number of name/value pairs in |nva|. */ size_t nvlen; /** * The category of this HEADERS frame. */ nghttp2_headers_category cat; } nghttp2_headers; /** * @struct * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. * * The PRIORITY frame. It has the following members: */ typedef struct { /** * The frame header. */ nghttp2_frame_hd hd; /** * The priority specification. */ nghttp2_priority_spec pri_spec; } nghttp2_priority; /** * @struct * * The RST_STREAM frame. It has the following members: */ typedef struct { /** * The frame header. */ nghttp2_frame_hd hd; /** * The error code. See :type:`nghttp2_error_code`. */ uint32_t error_code; } nghttp2_rst_stream; /** * @struct * * The SETTINGS ID/Value pair. It has the following members: */ typedef struct { /** * The SETTINGS ID. See :type:`nghttp2_settings_id`. */ int32_t settings_id; /** * The value of this entry. */ uint32_t value; } nghttp2_settings_entry; /** * @struct * * The SETTINGS frame. It has the following members: */ typedef struct { /** * The frame header. */ nghttp2_frame_hd hd; /** * The number of SETTINGS ID/Value pairs in |iv|. */ size_t niv; /** * The pointer to the array of SETTINGS ID/Value pair. */ nghttp2_settings_entry *iv; } nghttp2_settings; /** * @struct * * The PUSH_PROMISE frame. It has the following members: */ typedef struct { /** * The frame header. */ nghttp2_frame_hd hd; /** * The length of the padding in this frame. This includes PAD_HIGH * and PAD_LOW. */ size_t padlen; /** * The name/value pairs. */ nghttp2_nv *nva; /** * The number of name/value pairs in |nva|. */ size_t nvlen; /** * The promised stream ID */ int32_t promised_stream_id; /** * Reserved bit. Currently this is always set to 0 and application * should not expect something useful in here. */ uint8_t reserved; } nghttp2_push_promise; /** * @struct * * The PING frame. It has the following members: */ typedef struct { /** * The frame header. */ nghttp2_frame_hd hd; /** * The opaque data */ uint8_t opaque_data[8]; } nghttp2_ping; /** * @struct * * The GOAWAY frame. It has the following members: */ typedef struct { /** * The frame header. */ nghttp2_frame_hd hd; /** * The last stream stream ID. */ int32_t last_stream_id; /** * The error code. See :type:`nghttp2_error_code`. */ uint32_t error_code; /** * The additional debug data */ uint8_t *opaque_data; /** * The length of |opaque_data| member. */ size_t opaque_data_len; /** * Reserved bit. Currently this is always set to 0 and application * should not expect something useful in here. */ uint8_t reserved; } nghttp2_goaway; /** * @struct * * The WINDOW_UPDATE frame. It has the following members: */ typedef struct { /** * The frame header. */ nghttp2_frame_hd hd; /** * The window size increment. */ int32_t window_size_increment; /** * Reserved bit. Currently this is always set to 0 and application * should not expect something useful in here. */ uint8_t reserved; } nghttp2_window_update; /** * @struct * * The extension frame. It has following members: */ typedef struct { /** * The frame header. */ nghttp2_frame_hd hd; /** * The pointer to extension payload. The exact pointer type is * determined by hd.type. * * Currently, no extension is supported. This is a place holder for * the future extensions. */ void *payload; } nghttp2_extension; /** * @union * * This union includes all frames to pass them to various function * calls as nghttp2_frame type. The CONTINUATION frame is omitted * from here because the library deals with it internally. */ typedef union { /** * The frame header, which is convenient to inspect frame header. */ nghttp2_frame_hd hd; /** * The DATA frame. */ nghttp2_data data; /** * The HEADERS frame. */ nghttp2_headers headers; /** * The PRIORITY frame. */ nghttp2_priority priority; /** * The RST_STREAM frame. */ nghttp2_rst_stream rst_stream; /** * The SETTINGS frame. */ nghttp2_settings settings; /** * The PUSH_PROMISE frame. */ nghttp2_push_promise push_promise; /** * The PING frame. */ nghttp2_ping ping; /** * The GOAWAY frame. */ nghttp2_goaway goaway; /** * The WINDOW_UPDATE frame. */ nghttp2_window_update window_update; /** * The extension frame. */ nghttp2_extension ext; } nghttp2_frame; #ifndef NGHTTP2_NO_SSIZE_T /** * @functypedef * * .. warning:: * * Deprecated. Use :type:`nghttp2_send_callback2` instead. * * Callback function invoked when |session| wants to send data to the * remote peer. The implementation of this function must send at most * |length| bytes of data stored in |data|. The |flags| is currently * not used and always 0. It must return the number of bytes sent if * it succeeds. If it cannot send any single byte without blocking, * it must return :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`. For * other errors, it must return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. The * |user_data| pointer is the third argument passed in to the call to * `nghttp2_session_client_new()` or `nghttp2_session_server_new()`. * * This callback is required if the application uses * `nghttp2_session_send()` to send data to the remote endpoint. If * the application uses solely `nghttp2_session_mem_send()` instead, * this callback function is unnecessary. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_send_callback()`. * * .. note:: * * The |length| may be very small. If that is the case, and * application disables Nagle algorithm (``TCP_NODELAY``), then just * writing |data| to the network stack leads to very small packet, * and it is very inefficient. An application should be responsible * to buffer up small chunks of data as necessary to avoid this * situation. */ typedef ssize_t (*nghttp2_send_callback)(nghttp2_session *session, const uint8_t *data, size_t length, int flags, void *user_data); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @functypedef * * Callback function invoked when |session| wants to send data to the * remote peer. The implementation of this function must send at most * |length| bytes of data stored in |data|. The |flags| is currently * not used and always 0. It must return the number of bytes sent if * it succeeds. If it cannot send any single byte without blocking, * it must return :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`. For * other errors, it must return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. The * |user_data| pointer is the third argument passed in to the call to * `nghttp2_session_client_new()` or `nghttp2_session_server_new()`. * * This callback is required if the application uses * `nghttp2_session_send()` to send data to the remote endpoint. If * the application uses solely `nghttp2_session_mem_send2()` instead, * this callback function is unnecessary. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_send_callback2()`. * * .. note:: * * The |length| may be very small. If that is the case, and * application disables Nagle algorithm (``TCP_NODELAY``), then just * writing |data| to the network stack leads to very small packet, * and it is very inefficient. An application should be responsible * to buffer up small chunks of data as necessary to avoid this * situation. */ typedef nghttp2_ssize (*nghttp2_send_callback2)(nghttp2_session *session, const uint8_t *data, size_t length, int flags, void *user_data); /** * @functypedef * * Callback function invoked when * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_COPY` is used in * :type:`nghttp2_data_source_read_callback` to send complete DATA * frame. * * The |frame| is a DATA frame to send. The |framehd| is the * serialized frame header (9 bytes). The |length| is the length of * application data to send (this does not include padding). The * |source| is the same pointer passed to * :type:`nghttp2_data_source_read_callback`. * * The application first must send frame header |framehd| of length 9 * bytes. If ``frame->data.padlen > 0``, send 1 byte of value * ``frame->data.padlen - 1``. Then send exactly |length| bytes of * application data. Finally, if ``frame->data.padlen > 1``, send * ``frame->data.padlen - 1`` bytes of zero as padding. * * The application has to send complete DATA frame in this callback. * If all data were written successfully, return 0. * * If it cannot send any data at all, just return * :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`; the library will call * this callback with the same parameters later (It is recommended to * send complete DATA frame at once in this function to deal with * error; if partial frame data has already sent, it is impossible to * send another data in that state, and all we can do is tear down * connection). When data is fully processed, but application wants * to make `nghttp2_session_mem_send2()` or `nghttp2_session_send()` * return immediately without processing next frames, return * :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE`. If application decided to * reset this stream, return * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`, then * the library will send RST_STREAM with INTERNAL_ERROR as error code. * The application can also return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`, which will * result in connection closure. Returning any other value is treated * as :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` is returned. */ typedef int (*nghttp2_send_data_callback)(nghttp2_session *session, nghttp2_frame *frame, const uint8_t *framehd, size_t length, nghttp2_data_source *source, void *user_data); #ifndef NGHTTP2_NO_SSIZE_T /** * @functypedef * * .. warning:: * * Deprecated. Use :type:`nghttp2_recv_callback2` instead. * * Callback function invoked when |session| wants to receive data from * the remote peer. The implementation of this function must read at * most |length| bytes of data and store it in |buf|. The |flags| is * currently not used and always 0. It must return the number of * bytes written in |buf| if it succeeds. If it cannot read any * single byte without blocking, it must return * :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`. If it gets EOF * before it reads any single byte, it must return * :enum:`nghttp2_error.NGHTTP2_ERR_EOF`. For other errors, it must * return :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * Returning 0 is treated as * :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`. The |user_data| * pointer is the third argument passed in to the call to * `nghttp2_session_client_new()` or `nghttp2_session_server_new()`. * * This callback is required if the application uses * `nghttp2_session_recv()` to receive data from the remote endpoint. * If the application uses solely `nghttp2_session_mem_recv()` * instead, this callback function is unnecessary. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_recv_callback()`. */ typedef ssize_t (*nghttp2_recv_callback)(nghttp2_session *session, uint8_t *buf, size_t length, int flags, void *user_data); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @functypedef * * Callback function invoked when |session| wants to receive data from * the remote peer. The implementation of this function must read at * most |length| bytes of data and store it in |buf|. The |flags| is * currently not used and always 0. It must return the number of * bytes written in |buf| if it succeeds. If it cannot read any * single byte without blocking, it must return * :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`. If it gets EOF * before it reads any single byte, it must return * :enum:`nghttp2_error.NGHTTP2_ERR_EOF`. For other errors, it must * return :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * Returning 0 is treated as * :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`. The |user_data| * pointer is the third argument passed in to the call to * `nghttp2_session_client_new()` or `nghttp2_session_server_new()`. * * This callback is required if the application uses * `nghttp2_session_recv()` to receive data from the remote endpoint. * If the application uses solely `nghttp2_session_mem_recv2()` * instead, this callback function is unnecessary. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_recv_callback2()`. */ typedef nghttp2_ssize (*nghttp2_recv_callback2)(nghttp2_session *session, uint8_t *buf, size_t length, int flags, void *user_data); /** * @functypedef * * Callback function invoked by `nghttp2_session_recv()` and * `nghttp2_session_mem_recv2()` when a frame is received. The * |user_data| pointer is the third argument passed in to the call to * `nghttp2_session_client_new()` or `nghttp2_session_server_new()`. * * If frame is HEADERS or PUSH_PROMISE, the ``nva`` and ``nvlen`` * member of their data structure are always ``NULL`` and 0 * respectively. The header name/value pairs are emitted via * :type:`nghttp2_on_header_callback`. * * Only HEADERS and DATA frame can signal the end of incoming data. * If ``frame->hd.flags & NGHTTP2_FLAG_END_STREAM`` is nonzero, the * |frame| is the last frame from the remote peer in this stream. * * This callback won't be called for CONTINUATION frames. * HEADERS/PUSH_PROMISE + CONTINUATIONs are treated as single frame. * * The implementation of this function must return 0 if it succeeds. * If nonzero value is returned, it is treated as fatal error and * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_on_frame_recv_callback()`. */ typedef int (*nghttp2_on_frame_recv_callback)(nghttp2_session *session, const nghttp2_frame *frame, void *user_data); /** * @functypedef * * Callback function invoked by `nghttp2_session_recv()` and * `nghttp2_session_mem_recv2()` when an invalid non-DATA frame is * received. The error is indicated by the |lib_error_code|, which is * one of the values defined in :type:`nghttp2_error`. When this * callback function is invoked, the library automatically submits * either RST_STREAM or GOAWAY frame. The |user_data| pointer is the * third argument passed in to the call to * `nghttp2_session_client_new()` or `nghttp2_session_server_new()`. * * If frame is HEADERS or PUSH_PROMISE, the ``nva`` and ``nvlen`` * member of their data structure are always ``NULL`` and 0 * respectively. * * The implementation of this function must return 0 if it succeeds. * If nonzero is returned, it is treated as fatal error and * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_on_invalid_frame_recv_callback()`. */ typedef int (*nghttp2_on_invalid_frame_recv_callback)( nghttp2_session *session, const nghttp2_frame *frame, int lib_error_code, void *user_data); /** * @functypedef * * Callback function invoked when a chunk of data in DATA frame is * received. The |stream_id| is the stream ID this DATA frame belongs * to. The |flags| is the flags of DATA frame which this data chunk * is contained. ``(flags & NGHTTP2_FLAG_END_STREAM) != 0`` does not * necessarily mean this chunk of data is the last one in the stream. * You should use :type:`nghttp2_on_frame_recv_callback` to know all * data frames are received. The |user_data| pointer is the third * argument passed in to the call to `nghttp2_session_client_new()` or * `nghttp2_session_server_new()`. * * If the application uses `nghttp2_session_mem_recv2()`, it can * return :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` to make * `nghttp2_session_mem_recv2()` return without processing further * input bytes. The memory by pointed by the |data| is retained until * `nghttp2_session_mem_recv2()` or `nghttp2_session_recv()` is * called. The application must retain the input bytes which was used * to produce the |data| parameter, because it may refer to the memory * region included in the input bytes. * * The implementation of this function must return 0 if it succeeds. * If nonzero is returned, it is treated as fatal error, and * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_on_data_chunk_recv_callback()`. */ typedef int (*nghttp2_on_data_chunk_recv_callback)(nghttp2_session *session, uint8_t flags, int32_t stream_id, const uint8_t *data, size_t len, void *user_data); /** * @functypedef * * Callback function invoked just before the non-DATA frame |frame| is * sent. The |user_data| pointer is the third argument passed in to * the call to `nghttp2_session_client_new()` or * `nghttp2_session_server_new()`. * * The implementation of this function must return 0 if it succeeds. * It can also return :enum:`nghttp2_error.NGHTTP2_ERR_CANCEL` to * cancel the transmission of the given frame. * * If there is a fatal error while executing this callback, the * implementation should return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`, which makes * `nghttp2_session_send()` and `nghttp2_session_mem_send2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * If the other value is returned, it is treated as if * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` is returned. * But the implementation should not rely on this since the library * may define new return value to extend its capability. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_before_frame_send_callback()`. */ typedef int (*nghttp2_before_frame_send_callback)(nghttp2_session *session, const nghttp2_frame *frame, void *user_data); /** * @functypedef * * Callback function invoked after the frame |frame| is sent. The * |user_data| pointer is the third argument passed in to the call to * `nghttp2_session_client_new()` or `nghttp2_session_server_new()`. * * The implementation of this function must return 0 if it succeeds. * If nonzero is returned, it is treated as fatal error and * `nghttp2_session_send()` and `nghttp2_session_mem_send2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_on_frame_send_callback()`. */ typedef int (*nghttp2_on_frame_send_callback)(nghttp2_session *session, const nghttp2_frame *frame, void *user_data); /** * @functypedef * * Callback function invoked after the non-DATA frame |frame| is not * sent because of the error. The error is indicated by the * |lib_error_code|, which is one of the values defined in * :type:`nghttp2_error`. The |user_data| pointer is the third * argument passed in to the call to `nghttp2_session_client_new()` or * `nghttp2_session_server_new()`. * * The implementation of this function must return 0 if it succeeds. * If nonzero is returned, it is treated as fatal error and * `nghttp2_session_send()` and `nghttp2_session_mem_send2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * `nghttp2_session_get_stream_user_data()` can be used to get * associated data. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_on_frame_not_send_callback()`. */ typedef int (*nghttp2_on_frame_not_send_callback)(nghttp2_session *session, const nghttp2_frame *frame, int lib_error_code, void *user_data); /** * @functypedef * * Callback function invoked when the stream |stream_id| is closed. * The reason of closure is indicated by the |error_code|. The * |error_code| is usually one of :enum:`nghttp2_error_code`, but that * is not guaranteed. The stream_user_data, which was specified in * `nghttp2_submit_request2()` or `nghttp2_submit_headers()`, is still * available in this function. The |user_data| pointer is the third * argument passed in to the call to `nghttp2_session_client_new()` or * `nghttp2_session_server_new()`. * * This function is also called for a stream in reserved state. * * The implementation of this function must return 0 if it succeeds. * If nonzero is returned, it is treated as fatal error and * `nghttp2_session_recv()`, `nghttp2_session_mem_recv2()`, * `nghttp2_session_send()`, and `nghttp2_session_mem_send2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_on_stream_close_callback()`. */ typedef int (*nghttp2_on_stream_close_callback)(nghttp2_session *session, int32_t stream_id, uint32_t error_code, void *user_data); /** * @functypedef * * Callback function invoked when the reception of header block in * HEADERS or PUSH_PROMISE is started. Each header name/value pair * will be emitted by :type:`nghttp2_on_header_callback`. * * The ``frame->hd.flags`` may not have * :enum:`nghttp2_flag.NGHTTP2_FLAG_END_HEADERS` flag set, which * indicates that one or more CONTINUATION frames are involved. But * the application does not need to care about that because the header * name/value pairs are emitted transparently regardless of * CONTINUATION frames. * * The server applications probably create an object to store * information about new stream if ``frame->hd.type == * NGHTTP2_HEADERS`` and ``frame->headers.cat == * NGHTTP2_HCAT_REQUEST``. If |session| is configured as server side, * ``frame->headers.cat`` is either ``NGHTTP2_HCAT_REQUEST`` * containing request headers or ``NGHTTP2_HCAT_HEADERS`` containing * trailer fields and never get PUSH_PROMISE in this callback. * * For the client applications, ``frame->hd.type`` is either * ``NGHTTP2_HEADERS`` or ``NGHTTP2_PUSH_PROMISE``. In case of * ``NGHTTP2_HEADERS``, ``frame->headers.cat == * NGHTTP2_HCAT_RESPONSE`` means that it is the first response * headers, but it may be non-final response which is indicated by 1xx * status code. In this case, there may be zero or more HEADERS frame * with ``frame->headers.cat == NGHTTP2_HCAT_HEADERS`` which has * non-final response code and finally client gets exactly one HEADERS * frame with ``frame->headers.cat == NGHTTP2_HCAT_HEADERS`` * containing final response headers (non-1xx status code). The * trailer fields also has ``frame->headers.cat == * NGHTTP2_HCAT_HEADERS`` which does not contain any status code. * * Returning * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE` will * close the stream (promised stream if frame is PUSH_PROMISE) by * issuing RST_STREAM with * :enum:`nghttp2_error_code.NGHTTP2_INTERNAL_ERROR`. In this case, * :type:`nghttp2_on_header_callback` and * :type:`nghttp2_on_frame_recv_callback` will not be invoked. If a * different error code is desirable, use * `nghttp2_submit_rst_stream()` with a desired error code and then * return :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`. * Again, use ``frame->push_promise.promised_stream_id`` as stream_id * parameter in `nghttp2_submit_rst_stream()` if frame is * PUSH_PROMISE. * * The implementation of this function must return 0 if it succeeds. * It can return * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE` to * reset the stream (promised stream if frame is PUSH_PROMISE). For * critical errors, it must return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the other * value is returned, it is treated as if * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` is returned. If * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` is returned, * `nghttp2_session_mem_recv2()` function will immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_on_begin_headers_callback()`. */ typedef int (*nghttp2_on_begin_headers_callback)(nghttp2_session *session, const nghttp2_frame *frame, void *user_data); /** * @functypedef * * Callback function invoked when a header name/value pair is received * for the |frame|. The |name| of length |namelen| is header name. * The |value| of length |valuelen| is header value. The |flags| is * bitwise OR of one or more of :type:`nghttp2_nv_flag`. * * If :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_INDEX` is set in * |flags|, the receiver must not index this name/value pair when * forwarding it to the next hop. More specifically, "Literal Header * Field never Indexed" representation must be used in HPACK encoding. * * When this callback is invoked, ``frame->hd.type`` is either * :enum:`nghttp2_frame_type.NGHTTP2_HEADERS` or * :enum:`nghttp2_frame_type.NGHTTP2_PUSH_PROMISE`. After all header * name/value pairs are processed with this callback, and no error has * been detected, :type:`nghttp2_on_frame_recv_callback` will be * invoked. If there is an error in decompression, * :type:`nghttp2_on_frame_recv_callback` for the |frame| will not be * invoked. * * Both |name| and |value| are guaranteed to be NULL-terminated. The * |namelen| and |valuelen| do not include terminal NULL. If * `nghttp2_option_set_no_http_messaging()` is used with nonzero * value, NULL character may be included in |name| or |value| before * terminating NULL. * * Please note that unless `nghttp2_option_set_no_http_messaging()` is * used, nghttp2 library does perform validation against the |name| * and the |value| using `nghttp2_check_header_name()` and * `nghttp2_check_header_value()`. In addition to this, nghttp2 * performs validation based on HTTP Messaging rule, which is briefly * explained in :ref:`http-messaging` section. * * If the application uses `nghttp2_session_mem_recv2()`, it can * return :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` to make * `nghttp2_session_mem_recv2()` return without processing further * input bytes. The memory pointed by |frame|, |name| and |value| * parameters are retained until `nghttp2_session_mem_recv2()` or * `nghttp2_session_recv()` is called. The application must retain * the input bytes which was used to produce these parameters, because * it may refer to the memory region included in the input bytes. * * Returning * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE` will * close the stream (promised stream if frame is PUSH_PROMISE) by * issuing RST_STREAM with * :enum:`nghttp2_error_code.NGHTTP2_INTERNAL_ERROR`. In this case, * :type:`nghttp2_on_header_callback` and * :type:`nghttp2_on_frame_recv_callback` will not be invoked. If a * different error code is desirable, use * `nghttp2_submit_rst_stream()` with a desired error code and then * return :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`. * Again, use ``frame->push_promise.promised_stream_id`` as stream_id * parameter in `nghttp2_submit_rst_stream()` if frame is * PUSH_PROMISE. * * The implementation of this function must return 0 if it succeeds. * It may return :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` or * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`. For * other critical failures, it must return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the other * nonzero value is returned, it is treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` is returned, * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_on_header_callback()`. * * .. warning:: * * Application should properly limit the total buffer size to store * incoming header fields. Without it, peer may send large number * of header fields or large header fields to cause out of memory in * local endpoint. Due to how HPACK works, peer can do this * effectively without using much memory on their own. */ typedef int (*nghttp2_on_header_callback)(nghttp2_session *session, const nghttp2_frame *frame, const uint8_t *name, size_t namelen, const uint8_t *value, size_t valuelen, uint8_t flags, void *user_data); /** * @functypedef * * Callback function invoked when a header name/value pair is received * for the |frame|. The |name| is header name. The |value| is header * value. The |flags| is bitwise OR of one or more of * :type:`nghttp2_nv_flag`. * * This callback behaves like :type:`nghttp2_on_header_callback`, * except that |name| and |value| are stored in reference counted * buffer. If application wishes to keep these references without * copying them, use `nghttp2_rcbuf_incref()` to increment their * reference count. It is the application's responsibility to call * `nghttp2_rcbuf_decref()` if they called `nghttp2_rcbuf_incref()` so * as not to leak memory. If the |session| is created by * `nghttp2_session_server_new3()` or `nghttp2_session_client_new3()`, * the function to free memory is the one belongs to the mem * parameter. As long as this free function alives, |name| and * |value| can live after |session| was destroyed. */ typedef int (*nghttp2_on_header_callback2)(nghttp2_session *session, const nghttp2_frame *frame, nghttp2_rcbuf *name, nghttp2_rcbuf *value, uint8_t flags, void *user_data); /** * @functypedef * * Callback function invoked when a invalid header name/value pair is * received for the |frame|. * * The parameter and behaviour are similar to * :type:`nghttp2_on_header_callback`. The difference is that this * callback is only invoked when a invalid header name/value pair is * received which is treated as stream error if this callback is not * set. Only invalid regular header field are passed to this * callback. In other words, invalid pseudo header field is not * passed to this callback. Also header fields which includes upper * cased latter are also treated as error without passing them to this * callback. * * This callback is only considered if HTTP messaging validation is * turned on (which is on by default, see * `nghttp2_option_set_no_http_messaging()`). * * With this callback, application inspects the incoming invalid * field, and it also can reset stream from this callback by returning * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`. By * default, the error code is * :enum:`nghttp2_error_code.NGHTTP2_PROTOCOL_ERROR`. To change the * error code, call `nghttp2_submit_rst_stream()` with the error code * of choice in addition to returning * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`. * * If 0 is returned, the header field is ignored, and the stream is * not reset. */ typedef int (*nghttp2_on_invalid_header_callback)( nghttp2_session *session, const nghttp2_frame *frame, const uint8_t *name, size_t namelen, const uint8_t *value, size_t valuelen, uint8_t flags, void *user_data); /** * @functypedef * * Callback function invoked when a invalid header name/value pair is * received for the |frame|. * * The parameter and behaviour are similar to * :type:`nghttp2_on_header_callback2`. The difference is that this * callback is only invoked when a invalid header name/value pair is * received which is silently ignored if this callback is not set. * Only invalid regular header field are passed to this callback. In * other words, invalid pseudo header field is not passed to this * callback. Also header fields which includes upper cased latter are * also treated as error without passing them to this callback. * * This callback is only considered if HTTP messaging validation is * turned on (which is on by default, see * `nghttp2_option_set_no_http_messaging()`). * * With this callback, application inspects the incoming invalid * field, and it also can reset stream from this callback by returning * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`. By * default, the error code is * :enum:`nghttp2_error_code.NGHTTP2_INTERNAL_ERROR`. To change the * error code, call `nghttp2_submit_rst_stream()` with the error code * of choice in addition to returning * :enum:`nghttp2_error.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE`. */ typedef int (*nghttp2_on_invalid_header_callback2)( nghttp2_session *session, const nghttp2_frame *frame, nghttp2_rcbuf *name, nghttp2_rcbuf *value, uint8_t flags, void *user_data); #ifndef NGHTTP2_NO_SSIZE_T /** * @functypedef * * .. warning:: * * Deprecated. Use :type:`nghttp2_select_padding_callback2` * instead. * * Callback function invoked when the library asks application how * many padding bytes are required for the transmission of the * |frame|. The application must choose the total length of payload * including padded bytes in range [frame->hd.length, max_payloadlen], * inclusive. Choosing number not in this range will be treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. Returning * ``frame->hd.length`` means no padding is added. Returning * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` will make * `nghttp2_session_send()` and `nghttp2_session_mem_send()` functions * immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_select_padding_callback()`. */ typedef ssize_t (*nghttp2_select_padding_callback)(nghttp2_session *session, const nghttp2_frame *frame, size_t max_payloadlen, void *user_data); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @functypedef * * Callback function invoked when the library asks application how * many padding bytes are required for the transmission of the * |frame|. The application must choose the total length of payload * including padded bytes in range [frame->hd.length, max_payloadlen], * inclusive. Choosing number not in this range will be treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. Returning * ``frame->hd.length`` means no padding is added. Returning * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` will make * `nghttp2_session_send()` and `nghttp2_session_mem_send2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_select_padding_callback2()`. */ typedef nghttp2_ssize (*nghttp2_select_padding_callback2)( nghttp2_session *session, const nghttp2_frame *frame, size_t max_payloadlen, void *user_data); #ifndef NGHTTP2_NO_SSIZE_T /** * @functypedef * * .. warning:: * * Deprecated. Use * :type:`nghttp2_data_source_read_length_callback2` instead. * * Callback function invoked when library wants to get max length of * data to send data to the remote peer. The implementation of this * function should return a value in the following range. [1, * min(|session_remote_window_size|, |stream_remote_window_size|, * |remote_max_frame_size|)]. If a value greater than this range is * returned than the max allow value will be used. Returning a value * smaller than this range is treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. The * |frame_type| is provided for future extensibility and identifies * the type of frame (see :type:`nghttp2_frame_type`) for which to get * the length for. Currently supported frame types are: * :enum:`nghttp2_frame_type.NGHTTP2_DATA`. * * This callback can be used to control the length in bytes for which * :type:`nghttp2_data_source_read_callback` is allowed to send to the * remote endpoint. This callback is optional. Returning * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` will signal the * entire session failure. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_data_source_read_length_callback()`. */ typedef ssize_t (*nghttp2_data_source_read_length_callback)( nghttp2_session *session, uint8_t frame_type, int32_t stream_id, int32_t session_remote_window_size, int32_t stream_remote_window_size, uint32_t remote_max_frame_size, void *user_data); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @functypedef * * Callback function invoked when library wants to get max length of * data to send data to the remote peer. The implementation of this * function should return a value in the following range. [1, * min(|session_remote_window_size|, |stream_remote_window_size|, * |remote_max_frame_size|)]. If a value greater than this range is * returned than the max allow value will be used. Returning a value * smaller than this range is treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. The * |frame_type| is provided for future extensibility and identifies * the type of frame (see :type:`nghttp2_frame_type`) for which to get * the length for. Currently supported frame types are: * :enum:`nghttp2_frame_type.NGHTTP2_DATA`. * * This callback can be used to control the length in bytes for which * :type:`nghttp2_data_source_read_callback` is allowed to send to the * remote endpoint. This callback is optional. Returning * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` will signal the * entire session failure. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_data_source_read_length_callback2()`. */ typedef nghttp2_ssize (*nghttp2_data_source_read_length_callback2)( nghttp2_session *session, uint8_t frame_type, int32_t stream_id, int32_t session_remote_window_size, int32_t stream_remote_window_size, uint32_t remote_max_frame_size, void *user_data); /** * @functypedef * * Callback function invoked when a frame header is received. The * |hd| points to received frame header. * * Unlike :type:`nghttp2_on_frame_recv_callback`, this callback will * also be called when frame header of CONTINUATION frame is received. * * If both :type:`nghttp2_on_begin_frame_callback` and * :type:`nghttp2_on_begin_headers_callback` are set and HEADERS or * PUSH_PROMISE is received, :type:`nghttp2_on_begin_frame_callback` * will be called first. * * The implementation of this function must return 0 if it succeeds. * If nonzero value is returned, it is treated as fatal error and * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * * To set this callback to :type:`nghttp2_session_callbacks`, use * `nghttp2_session_callbacks_set_on_begin_frame_callback()`. */ typedef int (*nghttp2_on_begin_frame_callback)(nghttp2_session *session, const nghttp2_frame_hd *hd, void *user_data); /** * @functypedef * * Callback function invoked when chunk of extension frame payload is * received. The |hd| points to frame header. The received * chunk is |data| of length |len|. * * The implementation of this function must return 0 if it succeeds. * * To abort processing this extension frame, return * :enum:`nghttp2_error.NGHTTP2_ERR_CANCEL`. * * If fatal error occurred, application should return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. In this case, * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the other * values are returned, currently they are treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. */ typedef int (*nghttp2_on_extension_chunk_recv_callback)( nghttp2_session *session, const nghttp2_frame_hd *hd, const uint8_t *data, size_t len, void *user_data); /** * @functypedef * * Callback function invoked when library asks the application to * unpack extension payload from its wire format. The extension * payload has been passed to the application using * :type:`nghttp2_on_extension_chunk_recv_callback`. The frame header * is already unpacked by the library and provided as |hd|. * * To receive extension frames, the application must tell desired * extension frame type to the library using * `nghttp2_option_set_user_recv_extension_type()`. * * The implementation of this function may store the pointer to the * created object as a result of unpacking in |*payload|, and returns * 0. The pointer stored in |*payload| is opaque to the library, and * the library does not own its pointer. |*payload| is initialized as * ``NULL``. The |*payload| is available as ``frame->ext.payload`` in * :type:`nghttp2_on_frame_recv_callback`. Therefore if application * can free that memory inside :type:`nghttp2_on_frame_recv_callback` * callback. Of course, application has a liberty not to use * |*payload|, and do its own mechanism to process extension frames. * * To abort processing this extension frame, return * :enum:`nghttp2_error.NGHTTP2_ERR_CANCEL`. * * If fatal error occurred, application should return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. In this case, * `nghttp2_session_recv()` and `nghttp2_session_mem_recv2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the other * values are returned, currently they are treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. */ typedef int (*nghttp2_unpack_extension_callback)(nghttp2_session *session, void **payload, const nghttp2_frame_hd *hd, void *user_data); #ifndef NGHTTP2_NO_SSIZE_T /** * @functypedef * * .. warning:: * * Deprecated. Use :type:`nghttp2_pack_extension_callback2` * instead. * * Callback function invoked when library asks the application to pack * extension payload in its wire format. The frame header will be * packed by library. Application must pack payload only. * ``frame->ext.payload`` is the object passed to * `nghttp2_submit_extension()` as payload parameter. Application * must pack extension payload to the |buf| of its capacity |len| * bytes. The |len| is at least 16KiB. * * The implementation of this function should return the number of * bytes written into |buf| when it succeeds. * * To abort processing this extension frame, return * :enum:`nghttp2_error.NGHTTP2_ERR_CANCEL`, and * :type:`nghttp2_on_frame_not_send_callback` will be invoked. * * If fatal error occurred, application should return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. In this case, * `nghttp2_session_send()` and `nghttp2_session_mem_send()` functions * immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the other * values are returned, currently they are treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the return * value is strictly larger than |len|, it is treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. */ typedef ssize_t (*nghttp2_pack_extension_callback)(nghttp2_session *session, uint8_t *buf, size_t len, const nghttp2_frame *frame, void *user_data); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @functypedef * * Callback function invoked when library asks the application to pack * extension payload in its wire format. The frame header will be * packed by library. Application must pack payload only. * ``frame->ext.payload`` is the object passed to * `nghttp2_submit_extension()` as payload parameter. Application * must pack extension payload to the |buf| of its capacity |len| * bytes. The |len| is at least 16KiB. * * The implementation of this function should return the number of * bytes written into |buf| when it succeeds. * * To abort processing this extension frame, return * :enum:`nghttp2_error.NGHTTP2_ERR_CANCEL`, and * :type:`nghttp2_on_frame_not_send_callback` will be invoked. * * If fatal error occurred, application should return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. In this case, * `nghttp2_session_send()` and `nghttp2_session_mem_send2()` * functions immediately return * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the other * values are returned, currently they are treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. If the return * value is strictly larger than |len|, it is treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. */ typedef nghttp2_ssize (*nghttp2_pack_extension_callback2)( nghttp2_session *session, uint8_t *buf, size_t len, const nghttp2_frame *frame, void *user_data); /** * @functypedef * * .. warning:: * * Deprecated. Use :type:`nghttp2_error_callback2` instead. * * Callback function invoked when library provides the error message * intended for human consumption. This callback is solely for * debugging purpose. The |msg| is typically NULL-terminated string * of length |len|. |len| does not include the sentinel NULL * character. * * The format of error message may change between nghttp2 library * versions. The application should not depend on the particular * format. * * Normally, application should return 0 from this callback. If fatal * error occurred while doing something in this callback, application * should return :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * In this case, library will return immediately with return value * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. Currently, if * nonzero value is returned from this callback, they are treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`, but application * should not rely on this details. */ typedef int (*nghttp2_error_callback)(nghttp2_session *session, const char *msg, size_t len, void *user_data); /** * @functypedef * * Callback function invoked when library provides the error code, and * message. This callback is solely for debugging purpose. * |lib_error_code| is one of error code defined in * :enum:`nghttp2_error`. The |msg| is typically NULL-terminated * string of length |len|, and intended for human consumption. |len| * does not include the sentinel NULL character. * * The format of error message may change between nghttp2 library * versions. The application should not depend on the particular * format. * * Normally, application should return 0 from this callback. If fatal * error occurred while doing something in this callback, application * should return :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. * In this case, library will return immediately with return value * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`. Currently, if * nonzero value is returned from this callback, they are treated as * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE`, but application * should not rely on this details. */ typedef int (*nghttp2_error_callback2)(nghttp2_session *session, int lib_error_code, const char *msg, size_t len, void *user_data); struct nghttp2_session_callbacks; /** * @struct * * Callback functions for :type:`nghttp2_session`. The details of * this structure are intentionally hidden from the public API. */ typedef struct nghttp2_session_callbacks nghttp2_session_callbacks; /** * @function * * Initializes |*callbacks_ptr| with NULL values. * * The initialized object can be used when initializing multiple * :type:`nghttp2_session` objects. * * When the application finished using this object, it can use * `nghttp2_session_callbacks_del()` to free its memory. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_callbacks_new(nghttp2_session_callbacks **callbacks_ptr); /** * @function * * Frees any resources allocated for |callbacks|. If |callbacks| is * ``NULL``, this function does nothing. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_del(nghttp2_session_callbacks *callbacks); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_session_callbacks_set_send_callback2()` * with :type:`nghttp2_send_callback2` instead. * * Sets callback function invoked when a session wants to send data to * the remote peer. This callback is not necessary if the application * uses solely `nghttp2_session_mem_send()` to serialize data to * transmit. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_callback( nghttp2_session_callbacks *cbs, nghttp2_send_callback send_callback); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Sets callback function invoked when a session wants to send data to * the remote peer. This callback is not necessary if the application * uses solely `nghttp2_session_mem_send2()` to serialize data to * transmit. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_callback2( nghttp2_session_callbacks *cbs, nghttp2_send_callback2 send_callback); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_session_callbacks_set_recv_callback2()` * with :type:`nghttp2_recv_callback2` instead. * * Sets callback function invoked when the a session wants to receive * data from the remote peer. This callback is not necessary if the * application uses solely `nghttp2_session_mem_recv()` to process * received data. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_recv_callback( nghttp2_session_callbacks *cbs, nghttp2_recv_callback recv_callback); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Sets callback function invoked when the a session wants to receive * data from the remote peer. This callback is not necessary if the * application uses solely `nghttp2_session_mem_recv2()` to process * received data. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_recv_callback2( nghttp2_session_callbacks *cbs, nghttp2_recv_callback2 recv_callback); /** * @function * * Sets callback function invoked by `nghttp2_session_recv()` and * `nghttp2_session_mem_recv2()` when a frame is received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_frame_recv_callback( nghttp2_session_callbacks *cbs, nghttp2_on_frame_recv_callback on_frame_recv_callback); /** * @function * * Sets callback function invoked by `nghttp2_session_recv()` and * `nghttp2_session_mem_recv2()` when an invalid non-DATA frame is * received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_invalid_frame_recv_callback( nghttp2_session_callbacks *cbs, nghttp2_on_invalid_frame_recv_callback on_invalid_frame_recv_callback); /** * @function * * Sets callback function invoked when a chunk of data in DATA frame * is received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_data_chunk_recv_callback( nghttp2_session_callbacks *cbs, nghttp2_on_data_chunk_recv_callback on_data_chunk_recv_callback); /** * @function * * Sets callback function invoked before a non-DATA frame is sent. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_before_frame_send_callback( nghttp2_session_callbacks *cbs, nghttp2_before_frame_send_callback before_frame_send_callback); /** * @function * * Sets callback function invoked after a frame is sent. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_frame_send_callback( nghttp2_session_callbacks *cbs, nghttp2_on_frame_send_callback on_frame_send_callback); /** * @function * * Sets callback function invoked when a non-DATA frame is not sent * because of an error. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_frame_not_send_callback( nghttp2_session_callbacks *cbs, nghttp2_on_frame_not_send_callback on_frame_not_send_callback); /** * @function * * Sets callback function invoked when the stream is closed. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_stream_close_callback( nghttp2_session_callbacks *cbs, nghttp2_on_stream_close_callback on_stream_close_callback); /** * @function * * Sets callback function invoked when the reception of header block * in HEADERS or PUSH_PROMISE is started. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_begin_headers_callback( nghttp2_session_callbacks *cbs, nghttp2_on_begin_headers_callback on_begin_headers_callback); /** * @function * * Sets callback function invoked when a header name/value pair is * received. If both * `nghttp2_session_callbacks_set_on_header_callback()` and * `nghttp2_session_callbacks_set_on_header_callback2()` are used to * set callbacks, the latter has the precedence. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_header_callback( nghttp2_session_callbacks *cbs, nghttp2_on_header_callback on_header_callback); /** * @function * * Sets callback function invoked when a header name/value pair is * received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_header_callback2( nghttp2_session_callbacks *cbs, nghttp2_on_header_callback2 on_header_callback2); /** * @function * * Sets callback function invoked when a invalid header name/value * pair is received. If both * `nghttp2_session_callbacks_set_on_invalid_header_callback()` and * `nghttp2_session_callbacks_set_on_invalid_header_callback2()` are * used to set callbacks, the latter takes the precedence. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_invalid_header_callback( nghttp2_session_callbacks *cbs, nghttp2_on_invalid_header_callback on_invalid_header_callback); /** * @function * * Sets callback function invoked when a invalid header name/value * pair is received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_invalid_header_callback2( nghttp2_session_callbacks *cbs, nghttp2_on_invalid_header_callback2 on_invalid_header_callback2); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use * `nghttp2_session_callbacks_set_select_padding_callback2()` with * :type:`nghttp2_select_padding_callback2` instead. * * Sets callback function invoked when the library asks application * how many padding bytes are required for the transmission of the * given frame. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_select_padding_callback( nghttp2_session_callbacks *cbs, nghttp2_select_padding_callback select_padding_callback); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Sets callback function invoked when the library asks application * how many padding bytes are required for the transmission of the * given frame. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_select_padding_callback2( nghttp2_session_callbacks *cbs, nghttp2_select_padding_callback2 select_padding_callback); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use * `nghttp2_session_callbacks_set_data_source_read_length_callback2()` * with :type:`nghttp2_data_source_read_length_callback2` instead. * * Sets callback function determine the length allowed in * :type:`nghttp2_data_source_read_callback`. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_data_source_read_length_callback( nghttp2_session_callbacks *cbs, nghttp2_data_source_read_length_callback data_source_read_length_callback); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Sets callback function determine the length allowed in * :type:`nghttp2_data_source_read_callback2`. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_data_source_read_length_callback2( nghttp2_session_callbacks *cbs, nghttp2_data_source_read_length_callback2 data_source_read_length_callback); /** * @function * * Sets callback function invoked when a frame header is received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_begin_frame_callback( nghttp2_session_callbacks *cbs, nghttp2_on_begin_frame_callback on_begin_frame_callback); /** * @function * * Sets callback function invoked when * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_COPY` is used in * :type:`nghttp2_data_source_read_callback2` to avoid data copy. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_send_data_callback( nghttp2_session_callbacks *cbs, nghttp2_send_data_callback send_data_callback); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use * `nghttp2_session_callbacks_set_pack_extension_callback2()` with * :type:`nghttp2_pack_extension_callback2` instead. * * Sets callback function invoked when the library asks the * application to pack extension frame payload in wire format. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_pack_extension_callback( nghttp2_session_callbacks *cbs, nghttp2_pack_extension_callback pack_extension_callback); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Sets callback function invoked when the library asks the * application to pack extension frame payload in wire format. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_pack_extension_callback2( nghttp2_session_callbacks *cbs, nghttp2_pack_extension_callback2 pack_extension_callback); /** * @function * * Sets callback function invoked when the library asks the * application to unpack extension frame payload from wire format. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_unpack_extension_callback( nghttp2_session_callbacks *cbs, nghttp2_unpack_extension_callback unpack_extension_callback); /** * @function * * Sets callback function invoked when chunk of extension frame * payload is received. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_on_extension_chunk_recv_callback( nghttp2_session_callbacks *cbs, nghttp2_on_extension_chunk_recv_callback on_extension_chunk_recv_callback); /** * @function * * .. warning:: * * Deprecated. Use * `nghttp2_session_callbacks_set_error_callback2()` with * :type:`nghttp2_error_callback2` instead. * * Sets callback function invoked when library tells error message to * the application. * * If both :type:`nghttp2_error_callback` and * :type:`nghttp2_error_callback2` are set, the latter takes * precedence. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_error_callback( nghttp2_session_callbacks *cbs, nghttp2_error_callback error_callback); /** * @function * * Sets callback function invoked when library tells error code, and * message to the application. * * If both :type:`nghttp2_error_callback` and * :type:`nghttp2_error_callback2` are set, the latter takes * precedence. */ NGHTTP2_EXTERN void nghttp2_session_callbacks_set_error_callback2( nghttp2_session_callbacks *cbs, nghttp2_error_callback2 error_callback2); /** * @functypedef * * Custom memory allocator to replace malloc(). The |mem_user_data| * is the mem_user_data member of :type:`nghttp2_mem` structure. */ typedef void *(*nghttp2_malloc)(size_t size, void *mem_user_data); /** * @functypedef * * Custom memory allocator to replace free(). The |mem_user_data| is * the mem_user_data member of :type:`nghttp2_mem` structure. */ typedef void (*nghttp2_free)(void *ptr, void *mem_user_data); /** * @functypedef * * Custom memory allocator to replace calloc(). The |mem_user_data| * is the mem_user_data member of :type:`nghttp2_mem` structure. */ typedef void *(*nghttp2_calloc)(size_t nmemb, size_t size, void *mem_user_data); /** * @functypedef * * Custom memory allocator to replace realloc(). The |mem_user_data| * is the mem_user_data member of :type:`nghttp2_mem` structure. */ typedef void *(*nghttp2_realloc)(void *ptr, size_t size, void *mem_user_data); /** * @struct * * Custom memory allocator functions and user defined pointer. The * |mem_user_data| member is passed to each allocator function. This * can be used, for example, to achieve per-session memory pool. * * In the following example code, ``my_malloc``, ``my_free``, * ``my_calloc`` and ``my_realloc`` are the replacement of the * standard allocators ``malloc``, ``free``, ``calloc`` and * ``realloc`` respectively:: * * void *my_malloc_cb(size_t size, void *mem_user_data) { * return my_malloc(size); * } * * void my_free_cb(void *ptr, void *mem_user_data) { my_free(ptr); } * * void *my_calloc_cb(size_t nmemb, size_t size, void *mem_user_data) { * return my_calloc(nmemb, size); * } * * void *my_realloc_cb(void *ptr, size_t size, void *mem_user_data) { * return my_realloc(ptr, size); * } * * void session_new() { * nghttp2_session *session; * nghttp2_session_callbacks *callbacks; * nghttp2_mem mem = {NULL, my_malloc_cb, my_free_cb, my_calloc_cb, * my_realloc_cb}; * * ... * * nghttp2_session_client_new3(&session, callbacks, NULL, NULL, &mem); * * ... * } */ typedef struct { /** * An arbitrary user supplied data. This is passed to each * allocator function. */ void *mem_user_data; /** * Custom allocator function to replace malloc(). */ nghttp2_malloc malloc; /** * Custom allocator function to replace free(). */ nghttp2_free free; /** * Custom allocator function to replace calloc(). */ nghttp2_calloc calloc; /** * Custom allocator function to replace realloc(). */ nghttp2_realloc realloc; } nghttp2_mem; struct nghttp2_option; /** * @struct * * Configuration options for :type:`nghttp2_session`. The details of * this structure are intentionally hidden from the public API. */ typedef struct nghttp2_option nghttp2_option; /** * @function * * Initializes |*option_ptr| with default values. * * When the application finished using this object, it can use * `nghttp2_option_del()` to free its memory. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_option_new(nghttp2_option **option_ptr); /** * @function * * Frees any resources allocated for |option|. If |option| is * ``NULL``, this function does nothing. */ NGHTTP2_EXTERN void nghttp2_option_del(nghttp2_option *option); /** * @function * * This option prevents the library from sending WINDOW_UPDATE for a * connection automatically. If this option is set to nonzero, the * library won't send WINDOW_UPDATE for DATA until application calls * `nghttp2_session_consume()` to indicate the consumed amount of * data. Don't use `nghttp2_submit_window_update()` for this purpose. * By default, this option is set to zero. */ NGHTTP2_EXTERN void nghttp2_option_set_no_auto_window_update(nghttp2_option *option, int val); /** * @function * * This option sets the SETTINGS_MAX_CONCURRENT_STREAMS value of * remote endpoint as if it is received in SETTINGS frame. Without * specifying this option, the maximum number of outgoing concurrent * streams is initially limited to 100 to avoid issues when the local * endpoint submits lots of requests before receiving initial SETTINGS * frame from the remote endpoint, since sending them at once to the * remote endpoint could lead to rejection of some of the requests. * This value will be overwritten when the local endpoint receives * initial SETTINGS frame from the remote endpoint, either to the * value advertised in SETTINGS_MAX_CONCURRENT_STREAMS or to the * default value (unlimited) if none was advertised. */ NGHTTP2_EXTERN void nghttp2_option_set_peer_max_concurrent_streams(nghttp2_option *option, uint32_t val); /** * @function * * By default, nghttp2 library, if configured as server, requires * first 24 bytes of client magic byte string (MAGIC). In most cases, * this will simplify the implementation of server. But sometimes * server may want to detect the application protocol based on first * few bytes on clear text communication. * * If this option is used with nonzero |val|, nghttp2 library does not * handle MAGIC. It still checks following SETTINGS frame. This * means that applications should deal with MAGIC by themselves. * * If this option is not used or used with zero value, if MAGIC does * not match :macro:`NGHTTP2_CLIENT_MAGIC`, `nghttp2_session_recv()` * and `nghttp2_session_mem_recv2()` will return error * :enum:`nghttp2_error.NGHTTP2_ERR_BAD_CLIENT_MAGIC`, which is fatal * error. */ NGHTTP2_EXTERN void nghttp2_option_set_no_recv_client_magic(nghttp2_option *option, int val); /** * @function * * By default, nghttp2 library enforces subset of HTTP Messaging rules * described in `HTTP/2 specification, section 8 * `_. See * :ref:`http-messaging` section for details. For those applications * who use nghttp2 library as non-HTTP use, give nonzero to |val| to * disable this enforcement. Please note that disabling this feature * does not change the fundamental client and server model of HTTP. * That is, even if the validation is disabled, only client can send * requests. */ NGHTTP2_EXTERN void nghttp2_option_set_no_http_messaging(nghttp2_option *option, int val); /** * @function * * RFC 7540 does not enforce any limit on the number of incoming * reserved streams (in RFC 7540 terms, streams in reserved (remote) * state). This only affects client side, since only server can push * streams. Malicious server can push arbitrary number of streams, * and make client's memory exhausted. This option can set the * maximum number of such incoming streams to avoid possible memory * exhaustion. If this option is set, and pushed streams are * automatically closed on reception, without calling user provided * callback, if they exceed the given limit. The default value is * 200. If session is configured as server side, this option has no * effect. Server can control the number of streams to push. */ NGHTTP2_EXTERN void nghttp2_option_set_max_reserved_remote_streams(nghttp2_option *option, uint32_t val); /** * @function * * Sets extension frame type the application is willing to handle with * user defined callbacks (see * :type:`nghttp2_on_extension_chunk_recv_callback` and * :type:`nghttp2_unpack_extension_callback`). The |type| is * extension frame type, and must be strictly greater than 0x9. * Otherwise, this function does nothing. The application can call * this function multiple times to set more than one frame type to * receive. The application does not have to call this function if it * just sends extension frames. */ NGHTTP2_EXTERN void nghttp2_option_set_user_recv_extension_type(nghttp2_option *option, uint8_t type); /** * @function * * Sets extension frame type the application is willing to receive * using builtin handler. The |type| is the extension frame type to * receive, and must be strictly greater than 0x9. Otherwise, this * function does nothing. The application can call this function * multiple times to set more than one frame type to receive. The * application does not have to call this function if it just sends * extension frames. * * If same frame type is passed to both * `nghttp2_option_set_builtin_recv_extension_type()` and * `nghttp2_option_set_user_recv_extension_type()`, the latter takes * precedence. */ NGHTTP2_EXTERN void nghttp2_option_set_builtin_recv_extension_type(nghttp2_option *option, uint8_t type); /** * @function * * This option prevents the library from sending PING frame with ACK * flag set automatically when PING frame without ACK flag set is * received. If this option is set to nonzero, the library won't send * PING frame with ACK flag set in the response for incoming PING * frame. The application can send PING frame with ACK flag set using * `nghttp2_submit_ping()` with :enum:`nghttp2_flag.NGHTTP2_FLAG_ACK` * as flags parameter. */ NGHTTP2_EXTERN void nghttp2_option_set_no_auto_ping_ack(nghttp2_option *option, int val); /** * @function * * This option sets the maximum length of header block (a set of * header fields per one HEADERS frame) to send. The length of a * given set of header fields is calculated using * `nghttp2_hd_deflate_bound()`. The default value is 64KiB. If * application attempts to send header fields larger than this limit, * the transmission of the frame fails with error code * :enum:`nghttp2_error.NGHTTP2_ERR_FRAME_SIZE_ERROR`. */ NGHTTP2_EXTERN void nghttp2_option_set_max_send_header_block_length(nghttp2_option *option, size_t val); /** * @function * * This option sets the maximum dynamic table size for deflating * header fields. The default value is 4KiB. In HTTP/2, receiver of * deflated header block can specify maximum dynamic table size. The * actual maximum size is the minimum of the size receiver specified * and this option value. */ NGHTTP2_EXTERN void nghttp2_option_set_max_deflate_dynamic_table_size(nghttp2_option *option, size_t val); /** * @function * * This option prevents the library from retaining closed streams to * maintain the priority tree. If this option is set to nonzero, * applications can discard closed stream completely to save memory. * * If * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` * of value of 1 is submitted via `nghttp2_submit_settings()`, any * closed streams are not retained regardless of this option. */ NGHTTP2_EXTERN void nghttp2_option_set_no_closed_streams(nghttp2_option *option, int val); /** * @function * * This function sets the maximum number of outgoing SETTINGS ACK and * PING ACK frames retained in :type:`nghttp2_session` object. If * more than those frames are retained, the peer is considered to be * misbehaving and session will be closed. The default value is 1000. */ NGHTTP2_EXTERN void nghttp2_option_set_max_outbound_ack(nghttp2_option *option, size_t val); /** * @function * * This function sets the maximum number of SETTINGS entries per * SETTINGS frame that will be accepted. If more than those entries * are received, the peer is considered to be misbehaving and session * will be closed. The default value is 32. */ NGHTTP2_EXTERN void nghttp2_option_set_max_settings(nghttp2_option *option, size_t val); /** * @function * * This option, if set to nonzero, allows server to fallback to * :rfc:`7540` priorities if SETTINGS_NO_RFC7540_PRIORITIES was not * received from client, and server submitted * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` * = 1 via `nghttp2_submit_settings()`. Most of the advanced * functionality for RFC 7540 priorities are still disabled. This * fallback only enables the minimal feature set of RFC 7540 * priorities to deal with priority signaling from client. * * Client session ignores this option. */ NGHTTP2_EXTERN void nghttp2_option_set_server_fallback_rfc7540_priorities(nghttp2_option *option, int val); /** * @function * * This option, if set to nonzero, turns off RFC 9113 leading and * trailing white spaces validation against HTTP field value. Some * important fields, such as HTTP/2 pseudo header fields, are * validated more strictly and this option does not apply to them. */ NGHTTP2_EXTERN void nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation( nghttp2_option *option, int val); /** * @function * * This function sets the rate limit for the incoming stream reset * (RST_STREAM frame). It is server use only. It is a token-bucket * based rate limiter. |burst| specifies the number of tokens that is * initially available. The maximum number of tokens is capped to * this value. |rate| specifies the number of tokens that are * regenerated per second. An incoming RST_STREAM consumes one token. * If there is no token available, GOAWAY is sent to tear down the * connection. |burst| and |rate| default to 1000 and 33 * respectively. */ NGHTTP2_EXTERN void nghttp2_option_set_stream_reset_rate_limit(nghttp2_option *option, uint64_t burst, uint64_t rate); /** * @function * * This function sets the maximum number of CONTINUATION frames * following an incoming HEADER frame. If more than those frames are * received, the remote endpoint is considered to be misbehaving and * session will be closed. The default value is 8. */ NGHTTP2_EXTERN void nghttp2_option_set_max_continuations(nghttp2_option *option, size_t val); /** * @function * * Initializes |*session_ptr| for client use. The all members of * |callbacks| are copied to |*session_ptr|. Therefore |*session_ptr| * does not store |callbacks|. The |user_data| is an arbitrary user * supplied data, which will be passed to the callback functions. * * The :type:`nghttp2_send_callback2` must be specified. If the * application code uses `nghttp2_session_recv()`, the * :type:`nghttp2_recv_callback` must be specified. The other members * of |callbacks| can be ``NULL``. * * If this function fails, |*session_ptr| is left untouched. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_client_new(nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, void *user_data); /** * @function * * Initializes |*session_ptr| for server use. The all members of * |callbacks| are copied to |*session_ptr|. Therefore |*session_ptr| * does not store |callbacks|. The |user_data| is an arbitrary user * supplied data, which will be passed to the callback functions. * * The :type:`nghttp2_send_callback2` must be specified. If the * application code uses `nghttp2_session_recv()`, the * :type:`nghttp2_recv_callback` must be specified. The other members * of |callbacks| can be ``NULL``. * * If this function fails, |*session_ptr| is left untouched. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_server_new(nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, void *user_data); /** * @function * * Like `nghttp2_session_client_new()`, but with additional options * specified in the |option|. * * The |option| can be ``NULL`` and the call is equivalent to * `nghttp2_session_client_new()`. * * This function does not take ownership |option|. The application is * responsible for freeing |option| if it finishes using the object. * * The library code does not refer to |option| after this function * returns. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_client_new2(nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, void *user_data, const nghttp2_option *option); /** * @function * * Like `nghttp2_session_server_new()`, but with additional options * specified in the |option|. * * The |option| can be ``NULL`` and the call is equivalent to * `nghttp2_session_server_new()`. * * This function does not take ownership |option|. The application is * responsible for freeing |option| if it finishes using the object. * * The library code does not refer to |option| after this function * returns. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_server_new2(nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, void *user_data, const nghttp2_option *option); /** * @function * * Like `nghttp2_session_client_new2()`, but with additional custom * memory allocator specified in the |mem|. * * The |mem| can be ``NULL`` and the call is equivalent to * `nghttp2_session_client_new2()`. * * This function does not take ownership |mem|. The application is * responsible for freeing |mem|. * * The library code does not refer to |mem| pointer after this * function returns, so the application can safely free it. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_client_new3( nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, void *user_data, const nghttp2_option *option, nghttp2_mem *mem); /** * @function * * Like `nghttp2_session_server_new2()`, but with additional custom * memory allocator specified in the |mem|. * * The |mem| can be ``NULL`` and the call is equivalent to * `nghttp2_session_server_new2()`. * * This function does not take ownership |mem|. The application is * responsible for freeing |mem|. * * The library code does not refer to |mem| pointer after this * function returns, so the application can safely free it. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_server_new3( nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, void *user_data, const nghttp2_option *option, nghttp2_mem *mem); /** * @function * * Frees any resources allocated for |session|. If |session| is * ``NULL``, this function does nothing. */ NGHTTP2_EXTERN void nghttp2_session_del(nghttp2_session *session); /** * @function * * Sends pending frames to the remote peer. * * This function retrieves the highest prioritized frame from the * outbound queue and sends it to the remote peer. It does this as * many times as possible until the user callback * :type:`nghttp2_send_callback2` returns * :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`, the outbound queue * becomes empty or flow control is triggered (remote window size * becomes depleted or maximum number of concurrent streams is * reached). This function calls several callback functions which are * passed when initializing the |session|. Here is the simple time * chart which tells when each callback is invoked: * * 1. Get the next frame to send from outbound queue. * * 2. Prepare transmission of the frame. * * 3. If the control frame cannot be sent because some preconditions * are not met (e.g., request HEADERS cannot be sent after GOAWAY), * :type:`nghttp2_on_frame_not_send_callback` is invoked. Abort * the following steps. * * 4. If the frame is HEADERS, PUSH_PROMISE or DATA, * :type:`nghttp2_select_padding_callback` is invoked. * * 5. If the frame is request HEADERS, the stream is opened here. * * 6. :type:`nghttp2_before_frame_send_callback` is invoked. * * 7. If :enum:`nghttp2_error.NGHTTP2_ERR_CANCEL` is returned from * :type:`nghttp2_before_frame_send_callback`, the current frame * transmission is canceled, and * :type:`nghttp2_on_frame_not_send_callback` is invoked. Abort * the following steps. * * 8. :type:`nghttp2_send_callback2` is invoked one or more times to * send the frame. * * 9. :type:`nghttp2_on_frame_send_callback` is invoked. * * 10. If the transmission of the frame triggers closure of the * stream, the stream is closed and * :type:`nghttp2_on_stream_close_callback` is invoked. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` * The callback function failed. */ NGHTTP2_EXTERN int nghttp2_session_send(nghttp2_session *session); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_session_mem_send2()` instead. * * Returns the serialized data to send. * * This function behaves like `nghttp2_session_send()` except that it * does not use :type:`nghttp2_send_callback` to transmit data. * Instead, it assigns the pointer to the serialized data to the * |*data_ptr| and returns its length. The other callbacks are called * in the same way as they are in `nghttp2_session_send()`. * * If no data is available to send, this function returns 0. * * This function may not return all serialized data in one invocation. * To get all data, call this function repeatedly until it returns 0 * or one of negative error codes. * * The assigned |*data_ptr| is valid until the next call of * `nghttp2_session_mem_send()` or `nghttp2_session_send()`. * * The caller must send all data before sending the next chunk of * data. * * This function returns the length of the data pointed by the * |*data_ptr| if it succeeds, or one of the following negative error * codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * * .. note:: * * This function may produce very small byte string. If that is the * case, and application disables Nagle algorithm (``TCP_NODELAY``), * then writing this small chunk leads to very small packet, and it * is very inefficient. An application should be responsible to * buffer up small chunks of data as necessary to avoid this * situation. */ NGHTTP2_EXTERN ssize_t nghttp2_session_mem_send(nghttp2_session *session, const uint8_t **data_ptr); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Returns the serialized data to send. * * This function behaves like `nghttp2_session_send()` except that it * does not use :type:`nghttp2_send_callback2` to transmit data. * Instead, it assigns the pointer to the serialized data to the * |*data_ptr| and returns its length. The other callbacks are called * in the same way as they are in `nghttp2_session_send()`. * * If no data is available to send, this function returns 0. * * This function may not return all serialized data in one invocation. * To get all data, call this function repeatedly until it returns 0 * or one of negative error codes. * * The assigned |*data_ptr| is valid until the next call of * `nghttp2_session_mem_send2()` or `nghttp2_session_send()`. * * The caller must send all data before sending the next chunk of * data. * * This function returns the length of the data pointed by the * |*data_ptr| if it succeeds, or one of the following negative error * codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * * .. note:: * * This function may produce very small byte string. If that is the * case, and application disables Nagle algorithm (``TCP_NODELAY``), * then writing this small chunk leads to very small packet, and it * is very inefficient. An application should be responsible to * buffer up small chunks of data as necessary to avoid this * situation. */ NGHTTP2_EXTERN nghttp2_ssize nghttp2_session_mem_send2(nghttp2_session *session, const uint8_t **data_ptr); /** * @function * * Receives frames from the remote peer. * * This function receives as many frames as possible until the user * callback :type:`nghttp2_recv_callback` returns * :enum:`nghttp2_error.NGHTTP2_ERR_WOULDBLOCK`. This function calls * several callback functions which are passed when initializing the * |session|. Here is the simple time chart which tells when each * callback is invoked: * * 1. :type:`nghttp2_recv_callback` is invoked one or more times to * receive frame header. * * 2. When frame header is received, * :type:`nghttp2_on_begin_frame_callback` is invoked. * * 3. If the frame is DATA frame: * * 1. :type:`nghttp2_recv_callback` is invoked to receive DATA * payload. For each chunk of data, * :type:`nghttp2_on_data_chunk_recv_callback` is invoked. * * 2. If one DATA frame is completely received, * :type:`nghttp2_on_frame_recv_callback` is invoked. If the * reception of the frame triggers the closure of the stream, * :type:`nghttp2_on_stream_close_callback` is invoked. * * 4. If the frame is the control frame: * * 1. :type:`nghttp2_recv_callback` is invoked one or more times to * receive whole frame. * * 2. If the received frame is valid, then following actions are * taken. If the frame is either HEADERS or PUSH_PROMISE, * :type:`nghttp2_on_begin_headers_callback` is invoked. Then * :type:`nghttp2_on_header_callback` is invoked for each header * name/value pair. For invalid header field, * :type:`nghttp2_on_invalid_header_callback` is called. After * all name/value pairs are emitted successfully, * :type:`nghttp2_on_frame_recv_callback` is invoked. For other * frames, :type:`nghttp2_on_frame_recv_callback` is invoked. * If the reception of the frame triggers the closure of the * stream, :type:`nghttp2_on_stream_close_callback` is invoked. * * 3. If the received frame is unpacked but is interpreted as * invalid, :type:`nghttp2_on_invalid_frame_recv_callback` is * invoked. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_EOF` * The remote peer did shutdown on the connection. * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` * The callback function failed. * :enum:`nghttp2_error.NGHTTP2_ERR_BAD_CLIENT_MAGIC` * Invalid client magic was detected. This error only returns * when |session| was configured as server and * `nghttp2_option_set_no_recv_client_magic()` is not used with * nonzero value. * :enum:`nghttp2_error.NGHTTP2_ERR_FLOODED` * Flooding was detected in this HTTP/2 session, and it must be * closed. This is most likely caused by misbehaviour of peer. */ NGHTTP2_EXTERN int nghttp2_session_recv(nghttp2_session *session); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_session_mem_recv2()` instead. * * Processes data |in| as an input from the remote endpoint. The * |inlen| indicates the number of bytes to receive in the |in|. * * This function behaves like `nghttp2_session_recv()` except that it * does not use :type:`nghttp2_recv_callback` to receive data; the * |in| is the only data for the invocation of this function. If all * bytes are processed, this function returns. The other callbacks * are called in the same way as they are in `nghttp2_session_recv()`. * * In the current implementation, this function always tries to * processes |inlen| bytes of input data unless either an error occurs or * :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` is returned from * :type:`nghttp2_on_header_callback` or * :type:`nghttp2_on_data_chunk_recv_callback`. If * :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` is used, the return value * includes the number of bytes which was used to produce the data or * frame for the callback. * * This function returns the number of processed bytes, or one of the * following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` * The callback function failed. * :enum:`nghttp2_error.NGHTTP2_ERR_BAD_CLIENT_MAGIC` * Invalid client magic was detected. This error only returns * when |session| was configured as server and * `nghttp2_option_set_no_recv_client_magic()` is not used with * nonzero value. * :enum:`nghttp2_error.NGHTTP2_ERR_FLOODED` * Flooding was detected in this HTTP/2 session, and it must be * closed. This is most likely caused by misbehaviour of peer. */ NGHTTP2_EXTERN ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in, size_t inlen); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Processes data |in| as an input from the remote endpoint. The * |inlen| indicates the number of bytes to receive in the |in|. * * This function behaves like `nghttp2_session_recv()` except that it * does not use :type:`nghttp2_recv_callback` to receive data; the * |in| is the only data for the invocation of this function. If all * bytes are processed, this function returns. The other callbacks * are called in the same way as they are in `nghttp2_session_recv()`. * * In the current implementation, this function always tries to * processes |inlen| bytes of input data unless either an error occurs or * :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` is returned from * :type:`nghttp2_on_header_callback` or * :type:`nghttp2_on_data_chunk_recv_callback`. If * :enum:`nghttp2_error.NGHTTP2_ERR_PAUSE` is used, the return value * includes the number of bytes which was used to produce the data or * frame for the callback. * * This function returns the number of processed bytes, or one of the * following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_CALLBACK_FAILURE` * The callback function failed. * :enum:`nghttp2_error.NGHTTP2_ERR_BAD_CLIENT_MAGIC` * Invalid client magic was detected. This error only returns * when |session| was configured as server and * `nghttp2_option_set_no_recv_client_magic()` is not used with * nonzero value. * :enum:`nghttp2_error.NGHTTP2_ERR_FLOODED` * Flooding was detected in this HTTP/2 session, and it must be * closed. This is most likely caused by misbehaviour of peer. */ NGHTTP2_EXTERN nghttp2_ssize nghttp2_session_mem_recv2(nghttp2_session *session, const uint8_t *in, size_t inlen); /** * @function * * Puts back previously deferred DATA frame in the stream |stream_id| * to the outbound queue. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The stream does not exist; or no deferred data exist. * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_resume_data(nghttp2_session *session, int32_t stream_id); /** * @function * * Returns nonzero value if |session| wants to receive data from the * remote peer. * * If both `nghttp2_session_want_read()` and * `nghttp2_session_want_write()` return 0, the application should * drop the connection. */ NGHTTP2_EXTERN int nghttp2_session_want_read(nghttp2_session *session); /** * @function * * Returns nonzero value if |session| wants to send data to the remote * peer. * * If both `nghttp2_session_want_read()` and * `nghttp2_session_want_write()` return 0, the application should * drop the connection. */ NGHTTP2_EXTERN int nghttp2_session_want_write(nghttp2_session *session); /** * @function * * Returns stream_user_data for the stream |stream_id|. The * stream_user_data is provided by `nghttp2_submit_request2()`, * `nghttp2_submit_headers()` or * `nghttp2_session_set_stream_user_data()`. Unless it is set using * `nghttp2_session_set_stream_user_data()`, if the stream is * initiated by the remote endpoint, stream_user_data is always * ``NULL``. If the stream does not exist, this function returns * ``NULL``. */ NGHTTP2_EXTERN void * nghttp2_session_get_stream_user_data(nghttp2_session *session, int32_t stream_id); /** * @function * * Sets the |stream_user_data| to the stream denoted by the * |stream_id|. If a stream user data is already set to the stream, * it is replaced with the |stream_user_data|. It is valid to specify * ``NULL`` in the |stream_user_data|, which nullifies the associated * data pointer. * * It is valid to set the |stream_user_data| to the stream reserved by * PUSH_PROMISE frame. * * This function returns 0 if it succeeds, or one of following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The stream does not exist */ NGHTTP2_EXTERN int nghttp2_session_set_stream_user_data(nghttp2_session *session, int32_t stream_id, void *stream_user_data); /** * @function * * Sets |user_data| to |session|, overwriting the existing user data * specified in `nghttp2_session_client_new()`, or * `nghttp2_session_server_new()`. */ NGHTTP2_EXTERN void nghttp2_session_set_user_data(nghttp2_session *session, void *user_data); /** * @function * * Returns the number of frames in the outbound queue. This does not * include the deferred DATA frames. */ NGHTTP2_EXTERN size_t nghttp2_session_get_outbound_queue_size(nghttp2_session *session); /** * @function * * Returns the number of DATA payload in bytes received without * WINDOW_UPDATE transmission for the stream |stream_id|. The local * (receive) window size can be adjusted by * `nghttp2_submit_window_update()`. This function takes into account * that and returns effective data length. In particular, if the * local window size is reduced by submitting negative * window_size_increment with `nghttp2_submit_window_update()`, this * function returns the number of bytes less than actually received. * * This function returns -1 if it fails. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_effective_recv_data_length( nghttp2_session *session, int32_t stream_id); /** * @function * * Returns the local (receive) window size for the stream |stream_id|. * The local window size can be adjusted by * `nghttp2_submit_window_update()`. This function takes into account * that and returns effective window size. * * This function does not take into account the amount of received * data from the remote endpoint. Use * `nghttp2_session_get_stream_local_window_size()` to know the amount * of data the remote endpoint can send without receiving stream level * WINDOW_UPDATE frame. Note that each stream is still subject to the * connection level flow control. * * This function returns -1 if it fails. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_effective_local_window_size( nghttp2_session *session, int32_t stream_id); /** * @function * * Returns the amount of flow-controlled payload (e.g., DATA) that the * remote endpoint can send without receiving stream level * WINDOW_UPDATE frame. It is also subject to the connection level * flow control. So the actual amount of data to send is * min(`nghttp2_session_get_stream_local_window_size()`, * `nghttp2_session_get_local_window_size()`). * * This function returns -1 if it fails. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_local_window_size( nghttp2_session *session, int32_t stream_id); /** * @function * * Returns the number of DATA payload in bytes received without * WINDOW_UPDATE transmission for a connection. The local (receive) * window size can be adjusted by `nghttp2_submit_window_update()`. * This function takes into account that and returns effective data * length. In particular, if the local window size is reduced by * submitting negative window_size_increment with * `nghttp2_submit_window_update()`, this function returns the number * of bytes less than actually received. * * This function returns -1 if it fails. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_effective_recv_data_length(nghttp2_session *session); /** * @function * * Returns the local (receive) window size for a connection. The * local window size can be adjusted by * `nghttp2_submit_window_update()`. This function takes into account * that and returns effective window size. * * This function does not take into account the amount of received * data from the remote endpoint. Use * `nghttp2_session_get_local_window_size()` to know the amount of * data the remote endpoint can send without receiving * connection-level WINDOW_UPDATE frame. Note that each stream is * still subject to the stream level flow control. * * This function returns -1 if it fails. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_effective_local_window_size(nghttp2_session *session); /** * @function * * Returns the amount of flow-controlled payload (e.g., DATA) that the * remote endpoint can send without receiving connection level * WINDOW_UPDATE frame. Note that each stream is still subject to the * stream level flow control (see * `nghttp2_session_get_stream_local_window_size()`). * * This function returns -1 if it fails. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_local_window_size(nghttp2_session *session); /** * @function * * Returns the remote window size for a given stream |stream_id|. * * This is the amount of flow-controlled payload (e.g., DATA) that the * local endpoint can send without stream level WINDOW_UPDATE. There * is also connection level flow control, so the effective size of * payload that the local endpoint can actually send is * min(`nghttp2_session_get_stream_remote_window_size()`, * `nghttp2_session_get_remote_window_size()`). * * This function returns -1 if it fails. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_stream_remote_window_size( nghttp2_session *session, int32_t stream_id); /** * @function * * Returns the remote window size for a connection. * * This function always succeeds. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_remote_window_size(nghttp2_session *session); /** * @function * * Returns 1 if local peer half closed the given stream |stream_id|. * Returns 0 if it did not. Returns -1 if no such stream exists. */ NGHTTP2_EXTERN int nghttp2_session_get_stream_local_close(nghttp2_session *session, int32_t stream_id); /** * @function * * Returns 1 if remote peer half closed the given stream |stream_id|. * Returns 0 if it did not. Returns -1 if no such stream exists. */ NGHTTP2_EXTERN int nghttp2_session_get_stream_remote_close(nghttp2_session *session, int32_t stream_id); /** * @function * * Returns the current dynamic table size of HPACK inflater, including * the overhead 32 bytes per entry described in RFC 7541. */ NGHTTP2_EXTERN size_t nghttp2_session_get_hd_inflate_dynamic_table_size(nghttp2_session *session); /** * @function * * Returns the current dynamic table size of HPACK deflater including * the overhead 32 bytes per entry described in RFC 7541. */ NGHTTP2_EXTERN size_t nghttp2_session_get_hd_deflate_dynamic_table_size(nghttp2_session *session); /** * @function * * Signals the session so that the connection should be terminated. * * The last stream ID is the minimum value between the stream ID of a * stream for which :type:`nghttp2_on_frame_recv_callback` was called * most recently and the last stream ID we have sent to the peer * previously. * * The |error_code| is the error code of this GOAWAY frame. The * pre-defined error code is one of :enum:`nghttp2_error_code`. * * After the transmission, both `nghttp2_session_want_read()` and * `nghttp2_session_want_write()` return 0. * * This function should be called when the connection should be * terminated after sending GOAWAY. If the remaining streams should * be processed after GOAWAY, use `nghttp2_submit_goaway()` instead. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_terminate_session(nghttp2_session *session, uint32_t error_code); /** * @function * * Signals the session so that the connection should be terminated. * * This function behaves like `nghttp2_session_terminate_session()`, * but the last stream ID can be specified by the application for fine * grained control of stream. The HTTP/2 specification does not allow * last_stream_id to be increased. So the actual value sent as * last_stream_id is the minimum value between the given * |last_stream_id| and the last_stream_id we have previously sent to * the peer. * * The |last_stream_id| is peer's stream ID or 0. So if |session| is * initialized as client, |last_stream_id| must be even or 0. If * |session| is initialized as server, |last_stream_id| must be odd or * 0. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |last_stream_id| is invalid. */ NGHTTP2_EXTERN int nghttp2_session_terminate_session2(nghttp2_session *session, int32_t last_stream_id, uint32_t error_code); /** * @function * * Signals to the client that the server started graceful shutdown * procedure. * * This function is only usable for server. If this function is * called with client side session, this function returns * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE`. * * To gracefully shutdown HTTP/2 session, server should call this * function to send GOAWAY with last_stream_id (1u << 31) - 1. And * after some delay (e.g., 1 RTT), send another GOAWAY with the stream * ID that the server has some processing using * `nghttp2_submit_goaway()`. See also * `nghttp2_session_get_last_proc_stream_id()`. * * Unlike `nghttp2_submit_goaway()`, this function just sends GOAWAY * and does nothing more. This is a mere indication to the client * that session shutdown is imminent. The application should call * `nghttp2_submit_goaway()` with appropriate last_stream_id after * this call. * * If one or more GOAWAY frame have been already sent by either * `nghttp2_submit_goaway()` or `nghttp2_session_terminate_session()`, * this function has no effect. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` * The |session| is initialized as client. */ NGHTTP2_EXTERN int nghttp2_submit_shutdown_notice(nghttp2_session *session); /** * @function * * Returns the value of SETTINGS |id| notified by a remote endpoint. * The |id| must be one of values defined in * :enum:`nghttp2_settings_id`. */ NGHTTP2_EXTERN uint32_t nghttp2_session_get_remote_settings( nghttp2_session *session, nghttp2_settings_id id); /** * @function * * Returns the value of SETTINGS |id| of local endpoint acknowledged * by the remote endpoint. The |id| must be one of the values defined * in :enum:`nghttp2_settings_id`. */ NGHTTP2_EXTERN uint32_t nghttp2_session_get_local_settings( nghttp2_session *session, nghttp2_settings_id id); /** * @function * * Tells the |session| that next stream ID is |next_stream_id|. The * |next_stream_id| must be equal or greater than the value returned * by `nghttp2_session_get_next_stream_id()`. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |next_stream_id| is strictly less than the value * `nghttp2_session_get_next_stream_id()` returns; or * |next_stream_id| is invalid (e.g., even integer for client, or * odd integer for server). */ NGHTTP2_EXTERN int nghttp2_session_set_next_stream_id(nghttp2_session *session, int32_t next_stream_id); /** * @function * * Returns the next outgoing stream ID. Notice that return type is * uint32_t. If we run out of stream ID for this session, this * function returns 1 << 31. */ NGHTTP2_EXTERN uint32_t nghttp2_session_get_next_stream_id(nghttp2_session *session); /** * @function * * Tells the |session| that |size| bytes for a stream denoted by * |stream_id| were consumed by application and are ready to * WINDOW_UPDATE. The consumed bytes are counted towards both * connection and stream level WINDOW_UPDATE (see * `nghttp2_session_consume_connection()` and * `nghttp2_session_consume_stream()` to update consumption * independently). This function is intended to be used without * automatic window update (see * `nghttp2_option_set_no_auto_window_update()`). * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is 0. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` * Automatic WINDOW_UPDATE is not disabled. */ NGHTTP2_EXTERN int nghttp2_session_consume(nghttp2_session *session, int32_t stream_id, size_t size); /** * @function * * Like `nghttp2_session_consume()`, but this only tells library that * |size| bytes were consumed only for connection level. Note that * HTTP/2 maintains connection and stream level flow control windows * independently. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` * Automatic WINDOW_UPDATE is not disabled. */ NGHTTP2_EXTERN int nghttp2_session_consume_connection(nghttp2_session *session, size_t size); /** * @function * * Like `nghttp2_session_consume()`, but this only tells library that * |size| bytes were consumed only for stream denoted by |stream_id|. * Note that HTTP/2 maintains connection and stream level flow control * windows independently. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is 0. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` * Automatic WINDOW_UPDATE is not disabled. */ NGHTTP2_EXTERN int nghttp2_session_consume_stream(nghttp2_session *session, int32_t stream_id, size_t size); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. In the future release after the end of * 2024, this function will always return 0 without doing anything. * * Changes priority of existing stream denoted by |stream_id|. The * new priority specification is |pri_spec|. * * The priority is changed silently and instantly, and no PRIORITY * frame will be sent to notify the peer of this change. This * function may be useful for server to change the priority of pushed * stream. * * If |session| is initialized as server, and ``pri_spec->stream_id`` * points to the idle stream, the idle stream is created if it does * not exist. The created idle stream will depend on root stream * (stream 0) with weight 16. * * Otherwise, if stream denoted by ``pri_spec->stream_id`` is not * found, we use default priority instead of given |pri_spec|. That * is make stream depend on root stream with weight 16. * * If * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` * of value of 1 is submitted via `nghttp2_submit_settings()`, this * function does nothing and returns 0. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * Attempted to depend on itself; or no stream exist for the given * |stream_id|; or |stream_id| is 0 */ NGHTTP2_EXTERN int nghttp2_session_change_stream_priority(nghttp2_session *session, int32_t stream_id, const nghttp2_priority_spec *pri_spec); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. In the future release after the end of * 2024, this function will always return 0 without doing anything. * * Creates idle stream with the given |stream_id|, and priority * |pri_spec|. * * The stream creation is done without sending PRIORITY frame, which * means that peer does not know about the existence of this idle * stream in the local endpoint. * * RFC 7540 does not disallow the use of creation of idle stream with * odd or even stream ID regardless of client or server. So this * function can create odd or even stream ID regardless of client or * server. But probably it is a bit safer to use the stream ID the * local endpoint can initiate (in other words, use odd stream ID for * client, and even stream ID for server), to avoid potential * collision from peer's instruction. Also we can use * `nghttp2_session_set_next_stream_id()` to avoid to open created * idle streams accidentally if we follow this recommendation. * * If |session| is initialized as server, and ``pri_spec->stream_id`` * points to the idle stream, the idle stream is created if it does * not exist. The created idle stream will depend on root stream * (stream 0) with weight 16. * * Otherwise, if stream denoted by ``pri_spec->stream_id`` is not * found, we use default priority instead of given |pri_spec|. That * is make stream depend on root stream with weight 16. * * If * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` * of value of 1 is submitted via `nghttp2_submit_settings()`, this * function does nothing and returns 0. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * Attempted to depend on itself; or stream denoted by |stream_id| * already exists; or |stream_id| cannot be used to create idle * stream (in other words, local endpoint has already opened * stream ID greater than or equal to the given stream ID; or * |stream_id| is 0 */ NGHTTP2_EXTERN int nghttp2_session_create_idle_stream(nghttp2_session *session, int32_t stream_id, const nghttp2_priority_spec *pri_spec); /** * @function * * .. warning:: * * This function is deprecated in favor of * `nghttp2_session_upgrade2()`, because this function lacks the * parameter to tell the library the request method used in the * original HTTP request. This information is required for client * to validate actual response body length against content-length * header field (see `nghttp2_option_set_no_http_messaging()`). If * HEAD is used in request, the length of response body must be 0 * regardless of value included in content-length header field. * * Performs post-process of HTTP Upgrade request. This function can * be called from both client and server, but the behavior is very * different in each other. * * If called from client side, the |settings_payload| must be the * value sent in ``HTTP2-Settings`` header field and must be decoded * by base64url decoder. The |settings_payloadlen| is the length of * |settings_payload|. The |settings_payload| is unpacked and its * setting values will be submitted using `nghttp2_submit_settings()`. * This means that the client application code does not need to submit * SETTINGS by itself. The stream with stream ID=1 is opened and the * |stream_user_data| is used for its stream_user_data. The opened * stream becomes half-closed (local) state. * * If called from server side, the |settings_payload| must be the * value received in ``HTTP2-Settings`` header field and must be * decoded by base64url decoder. The |settings_payloadlen| is the * length of |settings_payload|. It is treated as if the SETTINGS * frame with that payload is received. Thus, callback functions for * the reception of SETTINGS frame will be invoked. The stream with * stream ID=1 is opened. The |stream_user_data| is ignored. The * opened stream becomes half-closed (remote). * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |settings_payload| is badly formed. * :enum:`nghttp2_error.NGHTTP2_ERR_PROTO` * The stream ID 1 is already used or closed; or is not available. */ NGHTTP2_EXTERN int nghttp2_session_upgrade(nghttp2_session *session, const uint8_t *settings_payload, size_t settings_payloadlen, void *stream_user_data); /** * @function * * Performs post-process of HTTP Upgrade request. This function can * be called from both client and server, but the behavior is very * different in each other. * * If called from client side, the |settings_payload| must be the * value sent in ``HTTP2-Settings`` header field and must be decoded * by base64url decoder. The |settings_payloadlen| is the length of * |settings_payload|. The |settings_payload| is unpacked and its * setting values will be submitted using `nghttp2_submit_settings()`. * This means that the client application code does not need to submit * SETTINGS by itself. The stream with stream ID=1 is opened and the * |stream_user_data| is used for its stream_user_data. The opened * stream becomes half-closed (local) state. * * If called from server side, the |settings_payload| must be the * value received in ``HTTP2-Settings`` header field and must be * decoded by base64url decoder. The |settings_payloadlen| is the * length of |settings_payload|. It is treated as if the SETTINGS * frame with that payload is received. Thus, callback functions for * the reception of SETTINGS frame will be invoked. The stream with * stream ID=1 is opened. The |stream_user_data| is ignored. The * opened stream becomes half-closed (remote). * * If the request method is HEAD, pass nonzero value to * |head_request|. Otherwise, pass 0. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |settings_payload| is badly formed. * :enum:`nghttp2_error.NGHTTP2_ERR_PROTO` * The stream ID 1 is already used or closed; or is not available. */ NGHTTP2_EXTERN int nghttp2_session_upgrade2(nghttp2_session *session, const uint8_t *settings_payload, size_t settings_payloadlen, int head_request, void *stream_user_data); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_pack_settings_payload2()` instead. * * Serializes the SETTINGS values |iv| in the |buf|. The size of the * |buf| is specified by |buflen|. The number of entries in the |iv| * array is given by |niv|. The required space in |buf| for the |niv| * entries is ``6*niv`` bytes and if the given buffer is too small, an * error is returned. This function is used mainly for creating a * SETTINGS payload to be sent with the ``HTTP2-Settings`` header * field in an HTTP Upgrade request. The data written in |buf| is NOT * base64url encoded and the application is responsible for encoding. * * This function returns the number of bytes written in |buf|, or one * of the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |iv| contains duplicate settings ID or invalid value. * * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE` * The provided |buflen| size is too small to hold the output. */ NGHTTP2_EXTERN ssize_t nghttp2_pack_settings_payload( uint8_t *buf, size_t buflen, const nghttp2_settings_entry *iv, size_t niv); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Serializes the SETTINGS values |iv| in the |buf|. The size of the * |buf| is specified by |buflen|. The number of entries in the |iv| * array is given by |niv|. The required space in |buf| for the |niv| * entries is ``6*niv`` bytes and if the given buffer is too small, an * error is returned. This function is used mainly for creating a * SETTINGS payload to be sent with the ``HTTP2-Settings`` header * field in an HTTP Upgrade request. The data written in |buf| is NOT * base64url encoded and the application is responsible for encoding. * * This function returns the number of bytes written in |buf|, or one * of the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |iv| contains duplicate settings ID or invalid value. * * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE` * The provided |buflen| size is too small to hold the output. */ NGHTTP2_EXTERN nghttp2_ssize nghttp2_pack_settings_payload2( uint8_t *buf, size_t buflen, const nghttp2_settings_entry *iv, size_t niv); /** * @function * * Returns string describing the |lib_error_code|. The * |lib_error_code| must be one of the :enum:`nghttp2_error`. */ NGHTTP2_EXTERN const char *nghttp2_strerror(int lib_error_code); /** * @function * * Returns string representation of HTTP/2 error code |error_code| * (e.g., ``PROTOCOL_ERROR`` is returned if ``error_code == * NGHTTP2_PROTOCOL_ERROR``). If string representation is unknown for * given |error_code|, this function returns string ``unknown``. */ NGHTTP2_EXTERN const char *nghttp2_http2_strerror(uint32_t error_code); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. * * Initializes |pri_spec| with the |stream_id| of the stream to depend * on with |weight| and its exclusive flag. If |exclusive| is * nonzero, exclusive flag is set. * * The |weight| must be in [:macro:`NGHTTP2_MIN_WEIGHT`, * :macro:`NGHTTP2_MAX_WEIGHT`], inclusive. */ NGHTTP2_EXTERN void nghttp2_priority_spec_init(nghttp2_priority_spec *pri_spec, int32_t stream_id, int32_t weight, int exclusive); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. * * Initializes |pri_spec| with the default values. The default values * are: stream_id = 0, weight = :macro:`NGHTTP2_DEFAULT_WEIGHT` and * exclusive = 0. */ NGHTTP2_EXTERN void nghttp2_priority_spec_default_init(nghttp2_priority_spec *pri_spec); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. * * Returns nonzero if the |pri_spec| is filled with default values. */ NGHTTP2_EXTERN int nghttp2_priority_spec_check_default(const nghttp2_priority_spec *pri_spec); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_submit_request2()` instead. * * Submits HEADERS frame and optionally one or more DATA frames. * * The |pri_spec| is a deprecated priority specification of this * request. ``NULL`` means the default priority (see * `nghttp2_priority_spec_default_init()`). To specify the priority, * use `nghttp2_priority_spec_init()`. If |pri_spec| is not ``NULL``, * this function will copy its data members. * * The ``pri_spec->weight`` must be in [:macro:`NGHTTP2_MIN_WEIGHT`, * :macro:`NGHTTP2_MAX_WEIGHT`], inclusive. If ``pri_spec->weight`` * is strictly less than :macro:`NGHTTP2_MIN_WEIGHT`, it becomes * :macro:`NGHTTP2_MIN_WEIGHT`. If it is strictly greater than * :macro:`NGHTTP2_MAX_WEIGHT`, it becomes * :macro:`NGHTTP2_MAX_WEIGHT`. * * If * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` * of value of 1 is received by a remote endpoint, |pri_spec| is * ignored, and treated as if ``NULL`` is specified. * * The |nva| is an array of name/value pair :type:`nghttp2_nv` with * |nvlen| elements. The application is responsible to include * required pseudo-header fields (header field whose name starts with * ":") in |nva| and must place pseudo-headers before regular header * fields. * * This function creates copies of all name/value pairs in |nva|. It * also lower-cases all names in |nva|. The order of elements in * |nva| is preserved. For header fields with * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME` and * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE` are set, * header field name and value are not copied respectively. With * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME`, application * is responsible to pass header field name in lowercase. The * application should maintain the references to them until * :type:`nghttp2_on_frame_send_callback` or * :type:`nghttp2_on_frame_not_send_callback` is called. * * HTTP/2 specification has requirement about header fields in the * request HEADERS. See the specification for more details. * * If |data_prd| is not ``NULL``, it provides data which will be sent * in subsequent DATA frames. In this case, a method that allows * request message bodies * (https://tools.ietf.org/html/rfc7231#section-4) must be specified * with ``:method`` key in |nva| (e.g. ``POST``). This function does * not take ownership of the |data_prd|. The function copies the * members of the |data_prd|. If |data_prd| is ``NULL``, HEADERS have * END_STREAM set. The |stream_user_data| is data associated to the * stream opened by this request and can be an arbitrary pointer, * which can be retrieved later by * `nghttp2_session_get_stream_user_data()`. * * This function returns assigned stream ID if it succeeds, or one of * the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE` * No stream ID is available because maximum stream ID was * reached. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * Trying to depend on itself (new stream ID equals * ``pri_spec->stream_id``). * :enum:`nghttp2_error.NGHTTP2_ERR_PROTO` * The |session| is server session. * * .. warning:: * * This function returns assigned stream ID if it succeeds. But * that stream is not created yet. The application must not submit * frame to that stream ID before * :type:`nghttp2_before_frame_send_callback` is called for this * frame. This means `nghttp2_session_get_stream_user_data()` does * not work before the callback. But * `nghttp2_session_set_stream_user_data()` handles this situation * specially, and it can set data to a stream during this period. * */ NGHTTP2_EXTERN int32_t nghttp2_submit_request( nghttp2_session *session, const nghttp2_priority_spec *pri_spec, const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider *data_prd, void *stream_user_data); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Submits HEADERS frame and optionally one or more DATA frames. * * The |pri_spec| is a deprecated priority specification of this * request. ``NULL`` means the default priority (see * `nghttp2_priority_spec_default_init()`). To specify the priority, * use `nghttp2_priority_spec_init()`. If |pri_spec| is not ``NULL``, * this function will copy its data members. In the future release * after the end of 2024, this function will ignore |pri_spec| and * behave as if ``NULL`` is given. * * The ``pri_spec->weight`` must be in [:macro:`NGHTTP2_MIN_WEIGHT`, * :macro:`NGHTTP2_MAX_WEIGHT`], inclusive. If ``pri_spec->weight`` * is strictly less than :macro:`NGHTTP2_MIN_WEIGHT`, it becomes * :macro:`NGHTTP2_MIN_WEIGHT`. If it is strictly greater than * :macro:`NGHTTP2_MAX_WEIGHT`, it becomes * :macro:`NGHTTP2_MAX_WEIGHT`. * * If * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` * of value of 1 is received by a remote endpoint, |pri_spec| is * ignored, and treated as if ``NULL`` is specified. * * The |nva| is an array of name/value pair :type:`nghttp2_nv` with * |nvlen| elements. The application is responsible to include * required pseudo-header fields (header field whose name starts with * ":") in |nva| and must place pseudo-headers before regular header * fields. * * This function creates copies of all name/value pairs in |nva|. It * also lower-cases all names in |nva|. The order of elements in * |nva| is preserved. For header fields with * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME` and * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE` are set, * header field name and value are not copied respectively. With * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME`, application * is responsible to pass header field name in lowercase. The * application should maintain the references to them until * :type:`nghttp2_on_frame_send_callback` or * :type:`nghttp2_on_frame_not_send_callback` is called. * * HTTP/2 specification has requirement about header fields in the * request HEADERS. See the specification for more details. * * If |data_prd| is not ``NULL``, it provides data which will be sent * in subsequent DATA frames. In this case, a method that allows * request message bodies * (https://tools.ietf.org/html/rfc7231#section-4) must be specified * with ``:method`` key in |nva| (e.g. ``POST``). This function does * not take ownership of the |data_prd|. The function copies the * members of the |data_prd|. If |data_prd| is ``NULL``, HEADERS have * END_STREAM set. The |stream_user_data| is data associated to the * stream opened by this request and can be an arbitrary pointer, * which can be retrieved later by * `nghttp2_session_get_stream_user_data()`. * * This function returns assigned stream ID if it succeeds, or one of * the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE` * No stream ID is available because maximum stream ID was * reached. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * Trying to depend on itself (new stream ID equals * ``pri_spec->stream_id``). * :enum:`nghttp2_error.NGHTTP2_ERR_PROTO` * The |session| is server session. * * .. warning:: * * This function returns assigned stream ID if it succeeds. But * that stream is not created yet. The application must not submit * frame to that stream ID before * :type:`nghttp2_before_frame_send_callback` is called for this * frame. This means `nghttp2_session_get_stream_user_data()` does * not work before the callback. But * `nghttp2_session_set_stream_user_data()` handles this situation * specially, and it can set data to a stream during this period. * */ NGHTTP2_EXTERN int32_t nghttp2_submit_request2( nghttp2_session *session, const nghttp2_priority_spec *pri_spec, const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider2 *data_prd, void *stream_user_data); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_submit_response2()` instead. * * Submits response HEADERS frame and optionally one or more DATA * frames against the stream |stream_id|. * * The |nva| is an array of name/value pair :type:`nghttp2_nv` with * |nvlen| elements. The application is responsible to include * required pseudo-header fields (header field whose name starts with * ":") in |nva| and must place pseudo-headers before regular header * fields. * * This function creates copies of all name/value pairs in |nva|. It * also lower-cases all names in |nva|. The order of elements in * |nva| is preserved. For header fields with * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME` and * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE` are set, * header field name and value are not copied respectively. With * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME`, application * is responsible to pass header field name in lowercase. The * application should maintain the references to them until * :type:`nghttp2_on_frame_send_callback` or * :type:`nghttp2_on_frame_not_send_callback` is called. * * HTTP/2 specification has requirement about header fields in the * response HEADERS. See the specification for more details. * * If |data_prd| is not ``NULL``, it provides data which will be sent * in subsequent DATA frames. This function does not take ownership * of the |data_prd|. The function copies the members of the * |data_prd|. If |data_prd| is ``NULL``, HEADERS will have * END_STREAM flag set. * * This method can be used as normal HTTP response and push response. * When pushing a resource using this function, the |session| must be * configured using `nghttp2_session_server_new()` or its variants and * the target stream denoted by the |stream_id| must be reserved using * `nghttp2_submit_push_promise()`. * * To send non-final response headers (e.g., HTTP status 101), don't * use this function because this function half-closes the outbound * stream. Instead, use `nghttp2_submit_headers()` for this purpose. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is 0. * :enum:`nghttp2_error.NGHTTP2_ERR_DATA_EXIST` * DATA or HEADERS has been already submitted and not fully * processed yet. Normally, this does not happen, but when * application wrongly calls `nghttp2_submit_response()` twice, * this may happen. * :enum:`nghttp2_error.NGHTTP2_ERR_PROTO` * The |session| is client session. * * .. warning:: * * Calling this function twice for the same stream ID may lead to * program crash. It is generally considered to a programming error * to commit response twice. */ NGHTTP2_EXTERN int nghttp2_submit_response(nghttp2_session *session, int32_t stream_id, const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider *data_prd); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Submits response HEADERS frame and optionally one or more DATA * frames against the stream |stream_id|. * * The |nva| is an array of name/value pair :type:`nghttp2_nv` with * |nvlen| elements. The application is responsible to include * required pseudo-header fields (header field whose name starts with * ":") in |nva| and must place pseudo-headers before regular header * fields. * * This function creates copies of all name/value pairs in |nva|. It * also lower-cases all names in |nva|. The order of elements in * |nva| is preserved. For header fields with * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME` and * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE` are set, * header field name and value are not copied respectively. With * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME`, application * is responsible to pass header field name in lowercase. The * application should maintain the references to them until * :type:`nghttp2_on_frame_send_callback` or * :type:`nghttp2_on_frame_not_send_callback` is called. * * HTTP/2 specification has requirement about header fields in the * response HEADERS. See the specification for more details. * * If |data_prd| is not ``NULL``, it provides data which will be sent * in subsequent DATA frames. This function does not take ownership * of the |data_prd|. The function copies the members of the * |data_prd|. If |data_prd| is ``NULL``, HEADERS will have * END_STREAM flag set. * * This method can be used as normal HTTP response and push response. * When pushing a resource using this function, the |session| must be * configured using `nghttp2_session_server_new()` or its variants and * the target stream denoted by the |stream_id| must be reserved using * `nghttp2_submit_push_promise()`. * * To send non-final response headers (e.g., HTTP status 101), don't * use this function because this function half-closes the outbound * stream. Instead, use `nghttp2_submit_headers()` for this purpose. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is 0. * :enum:`nghttp2_error.NGHTTP2_ERR_DATA_EXIST` * DATA or HEADERS has been already submitted and not fully * processed yet. Normally, this does not happen, but when * application wrongly calls `nghttp2_submit_response2()` twice, * this may happen. * :enum:`nghttp2_error.NGHTTP2_ERR_PROTO` * The |session| is client session. * * .. warning:: * * Calling this function twice for the same stream ID may lead to * program crash. It is generally considered to a programming error * to commit response twice. */ NGHTTP2_EXTERN int nghttp2_submit_response2(nghttp2_session *session, int32_t stream_id, const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider2 *data_prd); /** * @function * * Submits trailer fields HEADERS against the stream |stream_id|. * * The |nva| is an array of name/value pair :type:`nghttp2_nv` with * |nvlen| elements. The application must not include pseudo-header * fields (headers whose names starts with ":") in |nva|. * * This function creates copies of all name/value pairs in |nva|. It * also lower-cases all names in |nva|. The order of elements in * |nva| is preserved. For header fields with * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME` and * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE` are set, * header field name and value are not copied respectively. With * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME`, application * is responsible to pass header field name in lowercase. The * application should maintain the references to them until * :type:`nghttp2_on_frame_send_callback` or * :type:`nghttp2_on_frame_not_send_callback` is called. * * For server, trailer fields must follow response HEADERS or response * DATA without END_STREAM flat set. The library does not enforce * this requirement, and applications should do this for themselves. * If `nghttp2_submit_trailer()` is called before any response HEADERS * submission (usually by `nghttp2_submit_response2()`), the content * of |nva| will be sent as response headers, which will result in * error. * * This function has the same effect with `nghttp2_submit_headers()`, * with flags = :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM` and both * pri_spec and stream_user_data to NULL. * * To submit trailer fields after `nghttp2_submit_response2()` is * called, the application has to specify * :type:`nghttp2_data_provider2` to `nghttp2_submit_response2()`. * Inside of :type:`nghttp2_data_source_read_callback2`, when setting * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_EOF`, also set * :enum:`nghttp2_data_flag.NGHTTP2_DATA_FLAG_NO_END_STREAM`. After * that, the application can send trailer fields using * `nghttp2_submit_trailer()`. `nghttp2_submit_trailer()` can be used * inside :type:`nghttp2_data_source_read_callback2`. * * This function returns 0 if it succeeds and |stream_id| is -1. * Otherwise, this function returns 0 if it succeeds, or one of the * following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is 0. */ NGHTTP2_EXTERN int nghttp2_submit_trailer(nghttp2_session *session, int32_t stream_id, const nghttp2_nv *nva, size_t nvlen); /** * @function * * Submits HEADERS frame. The |flags| is bitwise OR of the * following values: * * * :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM` * * If |flags| includes :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM`, * this frame has END_STREAM flag set. * * The library handles the CONTINUATION frame internally and it * correctly sets END_HEADERS to the last sequence of the PUSH_PROMISE * or CONTINUATION frame. * * If the |stream_id| is -1, this frame is assumed as request (i.e., * request HEADERS frame which opens new stream). In this case, the * assigned stream ID will be returned. Otherwise, specify stream ID * in |stream_id|. * * The |pri_spec| is a deprecated priority specification of this * request. ``NULL`` means the default priority (see * `nghttp2_priority_spec_default_init()`). To specify the priority, * use `nghttp2_priority_spec_init()`. If |pri_spec| is not ``NULL``, * this function will copy its data members. In the future release * after the end of 2024, this function will ignore |pri_spec| and * behave as if ``NULL`` is given. * * The ``pri_spec->weight`` must be in [:macro:`NGHTTP2_MIN_WEIGHT`, * :macro:`NGHTTP2_MAX_WEIGHT`], inclusive. If ``pri_spec->weight`` * is strictly less than :macro:`NGHTTP2_MIN_WEIGHT`, it becomes * :macro:`NGHTTP2_MIN_WEIGHT`. If it is strictly greater than * :macro:`NGHTTP2_MAX_WEIGHT`, it becomes :macro:`NGHTTP2_MAX_WEIGHT`. * * If * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` * of value of 1 is received by a remote endpoint, |pri_spec| is * ignored, and treated as if ``NULL`` is specified. * * The |nva| is an array of name/value pair :type:`nghttp2_nv` with * |nvlen| elements. The application is responsible to include * required pseudo-header fields (header field whose name starts with * ":") in |nva| and must place pseudo-headers before regular header * fields. * * This function creates copies of all name/value pairs in |nva|. It * also lower-cases all names in |nva|. The order of elements in * |nva| is preserved. For header fields with * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME` and * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE` are set, * header field name and value are not copied respectively. With * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME`, application * is responsible to pass header field name in lowercase. The * application should maintain the references to them until * :type:`nghttp2_on_frame_send_callback` or * :type:`nghttp2_on_frame_not_send_callback` is called. * * The |stream_user_data| is a pointer to an arbitrary data which is * associated to the stream this frame will open. Therefore it is * only used if this frame opens streams, in other words, it changes * stream state from idle or reserved to open. * * This function is low-level in a sense that the application code can * specify flags directly. For usual HTTP request, * `nghttp2_submit_request2()` is useful. Likewise, for HTTP * response, prefer `nghttp2_submit_response2()`. * * This function returns newly assigned stream ID if it succeeds and * |stream_id| is -1. Otherwise, this function returns 0 if it * succeeds, or one of the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE` * No stream ID is available because maximum stream ID was * reached. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is 0; or trying to depend on itself (stream ID * equals ``pri_spec->stream_id``). * :enum:`nghttp2_error.NGHTTP2_ERR_DATA_EXIST` * DATA or HEADERS has been already submitted and not fully * processed yet. This happens if stream denoted by |stream_id| * is in reserved state. * :enum:`nghttp2_error.NGHTTP2_ERR_PROTO` * The |stream_id| is -1, and |session| is server session. * * .. warning:: * * This function returns assigned stream ID if it succeeds and * |stream_id| is -1. But that stream is not opened yet. The * application must not submit frame to that stream ID before * :type:`nghttp2_before_frame_send_callback` is called for this * frame. * */ NGHTTP2_EXTERN int32_t nghttp2_submit_headers( nghttp2_session *session, uint8_t flags, int32_t stream_id, const nghttp2_priority_spec *pri_spec, const nghttp2_nv *nva, size_t nvlen, void *stream_user_data); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_submit_data2()` instead. * * Submits one or more DATA frames to the stream |stream_id|. The * data to be sent are provided by |data_prd|. If |flags| contains * :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM`, the last DATA frame * has END_STREAM flag set. * * This function does not take ownership of the |data_prd|. The * function copies the members of the |data_prd|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_DATA_EXIST` * DATA or HEADERS has been already submitted and not fully * processed yet. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is 0. * :enum:`nghttp2_error.NGHTTP2_ERR_STREAM_CLOSED` * The stream was already closed; or the |stream_id| is invalid. * * .. note:: * * Currently, only one DATA or HEADERS is allowed for a stream at a * time. Submitting these frames more than once before first DATA * or HEADERS is finished results in * :enum:`nghttp2_error.NGHTTP2_ERR_DATA_EXIST` error code. The * earliest callback which tells that previous frame is done is * :type:`nghttp2_on_frame_send_callback`. In side that callback, * new data can be submitted using `nghttp2_submit_data()`. Of * course, all data except for last one must not have * :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM` flag set in |flags|. * This sounds a bit complicated, and we recommend to use * `nghttp2_submit_request()` and `nghttp2_submit_response()` to * avoid this cascading issue. The experience shows that for HTTP * use, these two functions are enough to implement both client and * server. */ NGHTTP2_EXTERN int nghttp2_submit_data(nghttp2_session *session, uint8_t flags, int32_t stream_id, const nghttp2_data_provider *data_prd); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Submits one or more DATA frames to the stream |stream_id|. The * data to be sent are provided by |data_prd|. If |flags| contains * :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM`, the last DATA frame * has END_STREAM flag set. * * This function does not take ownership of the |data_prd|. The * function copies the members of the |data_prd|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_DATA_EXIST` * DATA or HEADERS has been already submitted and not fully * processed yet. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is 0. * :enum:`nghttp2_error.NGHTTP2_ERR_STREAM_CLOSED` * The stream was already closed; or the |stream_id| is invalid. * * .. note:: * * Currently, only one DATA or HEADERS is allowed for a stream at a * time. Submitting these frames more than once before first DATA * or HEADERS is finished results in * :enum:`nghttp2_error.NGHTTP2_ERR_DATA_EXIST` error code. The * earliest callback which tells that previous frame is done is * :type:`nghttp2_on_frame_send_callback`. In side that callback, * new data can be submitted using `nghttp2_submit_data2()`. Of * course, all data except for last one must not have * :enum:`nghttp2_flag.NGHTTP2_FLAG_END_STREAM` flag set in |flags|. * This sounds a bit complicated, and we recommend to use * `nghttp2_submit_request2()` and `nghttp2_submit_response2()` to * avoid this cascading issue. The experience shows that for HTTP * use, these two functions are enough to implement both client and * server. */ NGHTTP2_EXTERN int nghttp2_submit_data2(nghttp2_session *session, uint8_t flags, int32_t stream_id, const nghttp2_data_provider2 *data_prd); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. In the future release after the end of * 2024, this function will always return 0 without doing anything. * * Submits PRIORITY frame to change the priority of stream |stream_id| * to the priority specification |pri_spec|. * * The |flags| is currently ignored and should be * :enum:`nghttp2_flag.NGHTTP2_FLAG_NONE`. * * The |pri_spec| is a deprecated priority specification of this * request. ``NULL`` is not allowed for this function. To specify the * priority, use `nghttp2_priority_spec_init()`. This function will * copy its data members. * * The ``pri_spec->weight`` must be in [:macro:`NGHTTP2_MIN_WEIGHT`, * :macro:`NGHTTP2_MAX_WEIGHT`], inclusive. If ``pri_spec->weight`` * is strictly less than :macro:`NGHTTP2_MIN_WEIGHT`, it becomes * :macro:`NGHTTP2_MIN_WEIGHT`. If it is strictly greater than * :macro:`NGHTTP2_MAX_WEIGHT`, it becomes * :macro:`NGHTTP2_MAX_WEIGHT`. * * If * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` * of value of 1 is received by a remote endpoint, this function does * nothing and returns 0. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is 0; or the |pri_spec| is NULL; or trying to * depend on itself. */ NGHTTP2_EXTERN int nghttp2_submit_priority(nghttp2_session *session, uint8_t flags, int32_t stream_id, const nghttp2_priority_spec *pri_spec); /** * @macro * * :macro:`NGHTTP2_EXTPRI_DEFAULT_URGENCY` is the default urgency * level for :rfc:`9218` extensible priorities. */ #define NGHTTP2_EXTPRI_DEFAULT_URGENCY 3 /** * @macro * * :macro:`NGHTTP2_EXTPRI_URGENCY_HIGH` is the highest urgency level * for :rfc:`9218` extensible priorities. */ #define NGHTTP2_EXTPRI_URGENCY_HIGH 0 /** * @macro * * :macro:`NGHTTP2_EXTPRI_URGENCY_LOW` is the lowest urgency level for * :rfc:`9218` extensible priorities. */ #define NGHTTP2_EXTPRI_URGENCY_LOW 7 /** * @macro * * :macro:`NGHTTP2_EXTPRI_URGENCY_LEVELS` is the number of urgency * levels for :rfc:`9218` extensible priorities. */ #define NGHTTP2_EXTPRI_URGENCY_LEVELS (NGHTTP2_EXTPRI_URGENCY_LOW + 1) /** * @struct * * :type:`nghttp2_extpri` is :rfc:`9218` extensible priorities * specification for a stream. */ typedef struct nghttp2_extpri { /** * :member:`urgency` is the urgency of a stream, it must be in * [:macro:`NGHTTP2_EXTPRI_URGENCY_HIGH`, * :macro:`NGHTTP2_EXTPRI_URGENCY_LOW`], inclusive, and 0 is the * highest urgency. */ uint32_t urgency; /** * :member:`inc` indicates that a content can be processed * incrementally or not. If inc is 0, it cannot be processed * incrementally. If inc is 1, it can be processed incrementally. * Other value is not permitted. */ int inc; } nghttp2_extpri; /** * @function * * Submits RST_STREAM frame to cancel/reject the stream |stream_id| * with the error code |error_code|. * * The pre-defined error code is one of :enum:`nghttp2_error_code`. * * The |flags| is currently ignored and should be * :enum:`nghttp2_flag.NGHTTP2_FLAG_NONE`. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is 0. */ NGHTTP2_EXTERN int nghttp2_submit_rst_stream(nghttp2_session *session, uint8_t flags, int32_t stream_id, uint32_t error_code); /** * @function * * Stores local settings and submits SETTINGS frame. The |iv| is the * pointer to the array of :type:`nghttp2_settings_entry`. The |niv| * indicates the number of :type:`nghttp2_settings_entry`. * * The |flags| is currently ignored and should be * :enum:`nghttp2_flag.NGHTTP2_FLAG_NONE`. * * This function does not take ownership of the |iv|. This function * copies all the elements in the |iv|. * * While updating individual stream's local window size, if the window * size becomes strictly larger than NGHTTP2_MAX_WINDOW_SIZE, * RST_STREAM is issued against such a stream. * * SETTINGS with :enum:`nghttp2_flag.NGHTTP2_FLAG_ACK` is * automatically submitted by the library and application could not * send it at its will. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |iv| contains invalid value (e.g., initial window size * strictly greater than (1 << 31) - 1. * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_submit_settings(nghttp2_session *session, uint8_t flags, const nghttp2_settings_entry *iv, size_t niv); /** * @function * * Submits PUSH_PROMISE frame. * * The |flags| is currently ignored. The library handles the * CONTINUATION frame internally and it correctly sets END_HEADERS to * the last sequence of the PUSH_PROMISE or CONTINUATION frame. * * The |stream_id| must be client initiated stream ID. * * The |nva| is an array of name/value pair :type:`nghttp2_nv` with * |nvlen| elements. The application is responsible to include * required pseudo-header fields (header field whose name starts with * ":") in |nva| and must place pseudo-headers before regular header * fields. * * This function creates copies of all name/value pairs in |nva|. It * also lower-cases all names in |nva|. The order of elements in * |nva| is preserved. For header fields with * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME` and * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_VALUE` are set, * header field name and value are not copied respectively. With * :enum:`nghttp2_nv_flag.NGHTTP2_NV_FLAG_NO_COPY_NAME`, application * is responsible to pass header field name in lowercase. The * application should maintain the references to them until * :type:`nghttp2_on_frame_send_callback` or * :type:`nghttp2_on_frame_not_send_callback` is called. * * The |promised_stream_user_data| is a pointer to an arbitrary data * which is associated to the promised stream this frame will open and * make it in reserved state. It is available using * `nghttp2_session_get_stream_user_data()`. The application can * access it in :type:`nghttp2_before_frame_send_callback` and * :type:`nghttp2_on_frame_send_callback` of this frame. * * The client side is not allowed to use this function. * * To submit response headers and data, use * `nghttp2_submit_response2()`. * * This function returns assigned promised stream ID if it succeeds, * or one of the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_PROTO` * This function was invoked when |session| is initialized as * client. * :enum:`nghttp2_error.NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE` * No stream ID is available because maximum stream ID was * reached. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is 0; The |stream_id| does not designate stream * that peer initiated. * :enum:`nghttp2_error.NGHTTP2_ERR_STREAM_CLOSED` * The stream was already closed; or the |stream_id| is invalid. * * .. warning:: * * This function returns assigned promised stream ID if it succeeds. * As of 1.16.0, stream object for pushed resource is created when * this function succeeds. In that case, the application can submit * push response for the promised frame. * * In 1.15.0 or prior versions, pushed stream is not opened yet when * this function succeeds. The application must not submit frame to * that stream ID before :type:`nghttp2_before_frame_send_callback` * is called for this frame. * */ NGHTTP2_EXTERN int32_t nghttp2_submit_push_promise( nghttp2_session *session, uint8_t flags, int32_t stream_id, const nghttp2_nv *nva, size_t nvlen, void *promised_stream_user_data); /** * @function * * Submits PING frame. You don't have to send PING back when you * received PING frame. The library automatically submits PING frame * in this case. * * The |flags| is bitwise OR of 0 or more of the following value. * * * :enum:`nghttp2_flag.NGHTTP2_FLAG_ACK` * * Unless `nghttp2_option_set_no_auto_ping_ack()` is used, the |flags| * should be :enum:`nghttp2_flag.NGHTTP2_FLAG_NONE`. * * If the |opaque_data| is non ``NULL``, then it should point to the 8 * bytes array of memory to specify opaque data to send with PING * frame. If the |opaque_data| is ``NULL``, zero-cleared 8 bytes will * be sent as opaque data. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_submit_ping(nghttp2_session *session, uint8_t flags, const uint8_t *opaque_data); /** * @function * * Submits GOAWAY frame with the last stream ID |last_stream_id| and * the error code |error_code|. * * The pre-defined error code is one of :enum:`nghttp2_error_code`. * * The |flags| is currently ignored and should be * :enum:`nghttp2_flag.NGHTTP2_FLAG_NONE`. * * The |last_stream_id| is peer's stream ID or 0. So if |session| is * initialized as client, |last_stream_id| must be even or 0. If * |session| is initialized as server, |last_stream_id| must be odd or * 0. * * The HTTP/2 specification says last_stream_id must not be increased * from the value previously sent. So the actual value sent as * last_stream_id is the minimum value between the given * |last_stream_id| and the last_stream_id previously sent to the * peer. * * If the |opaque_data| is not ``NULL`` and |opaque_data_len| is not * zero, those data will be sent as additional debug data. The * library makes a copy of the memory region pointed by |opaque_data| * with the length |opaque_data_len|, so the caller does not need to * keep this memory after the return of this function. If the * |opaque_data_len| is 0, the |opaque_data| could be ``NULL``. * * After successful transmission of GOAWAY, following things happen. * All incoming streams having strictly more than |last_stream_id| are * closed. All incoming HEADERS which starts new stream are simply * ignored. After all active streams are handled, both * `nghttp2_session_want_read()` and `nghttp2_session_want_write()` * return 0 and the application can close session. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |opaque_data_len| is too large; the |last_stream_id| is * invalid. */ NGHTTP2_EXTERN int nghttp2_submit_goaway(nghttp2_session *session, uint8_t flags, int32_t last_stream_id, uint32_t error_code, const uint8_t *opaque_data, size_t opaque_data_len); /** * @function * * Returns the last stream ID of a stream for which * :type:`nghttp2_on_frame_recv_callback` was invoked most recently. * The returned value can be used as last_stream_id parameter for * `nghttp2_submit_goaway()` and * `nghttp2_session_terminate_session2()`. * * This function always succeeds. */ NGHTTP2_EXTERN int32_t nghttp2_session_get_last_proc_stream_id(nghttp2_session *session); /** * @function * * Returns nonzero if new request can be sent from local endpoint. * * This function return 0 if request is not allowed for this session. * There are several reasons why request is not allowed. Some of the * reasons are: session is server; stream ID has been spent; GOAWAY * has been sent or received. * * The application can call `nghttp2_submit_request2()` without * consulting this function. In that case, * `nghttp2_submit_request2()` may return error. Or, request is * failed to sent, and :type:`nghttp2_on_stream_close_callback` is * called. */ NGHTTP2_EXTERN int nghttp2_session_check_request_allowed(nghttp2_session *session); /** * @function * * Returns nonzero if |session| is initialized as server side session. */ NGHTTP2_EXTERN int nghttp2_session_check_server_session(nghttp2_session *session); /** * @function * * Submits WINDOW_UPDATE frame. * * The |flags| is currently ignored and should be * :enum:`nghttp2_flag.NGHTTP2_FLAG_NONE`. * * The |stream_id| is the stream ID to send this WINDOW_UPDATE. To * send connection level WINDOW_UPDATE, specify 0 to |stream_id|. * * If the |window_size_increment| is positive, the WINDOW_UPDATE with * that value as window_size_increment is queued. If the * |window_size_increment| is larger than the received bytes from the * remote endpoint, the local window size is increased by that * difference. If the sole purpose is to increase the local window * size, consider to use `nghttp2_session_set_local_window_size()`. * * If the |window_size_increment| is negative, the local window size * is decreased by -|window_size_increment|. If automatic * WINDOW_UPDATE is enabled * (`nghttp2_option_set_no_auto_window_update()`), and the library * decided that the WINDOW_UPDATE should be submitted, then * WINDOW_UPDATE is queued with the current received bytes count. If * the sole purpose is to decrease the local window size, consider to * use `nghttp2_session_set_local_window_size()`. * * If the |window_size_increment| is 0, the function does nothing and * returns 0. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_FLOW_CONTROL` * The local window size overflow or gets negative. * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_submit_window_update(nghttp2_session *session, uint8_t flags, int32_t stream_id, int32_t window_size_increment); /** * @function * * Set local window size (local endpoints's window size) to the given * |window_size| for the given stream denoted by |stream_id|. To * change connection level window size, specify 0 to |stream_id|. To * increase window size, this function may submit WINDOW_UPDATE frame * to transmission queue. * * The |flags| is currently ignored and should be * :enum:`nghttp2_flag.NGHTTP2_FLAG_NONE`. * * This sounds similar to `nghttp2_submit_window_update()`, but there * are 2 differences. The first difference is that this function * takes the absolute value of window size to set, rather than the * delta. To change the window size, this may be easier to use since * the application just declares the intended window size, rather than * calculating delta. The second difference is that * `nghttp2_submit_window_update()` affects the received bytes count * which has not acked yet. By the specification of * `nghttp2_submit_window_update()`, to strictly increase the local * window size, we have to submit delta including all received bytes * count, which might not be desirable in some cases. On the other * hand, this function does not affect the received bytes count. It * just sets the local window size to the given value. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |stream_id| is negative. * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_session_set_local_window_size(nghttp2_session *session, uint8_t flags, int32_t stream_id, int32_t window_size); /** * @function * * Submits extension frame. * * Application can pass arbitrary frame flags and stream ID in |flags| * and |stream_id| respectively. The |payload| is opaque pointer, and * it can be accessible though ``frame->ext.payload`` in * :type:`nghttp2_pack_extension_callback2`. The library will not own * passed |payload| pointer. * * The application must set :type:`nghttp2_pack_extension_callback2` * using `nghttp2_session_callbacks_set_pack_extension_callback2()`. * * The application should retain the memory pointed by |payload| until * the transmission of extension frame is done (which is indicated by * :type:`nghttp2_on_frame_send_callback`), or transmission fails * (which is indicated by :type:`nghttp2_on_frame_not_send_callback`). * If application does not touch this memory region after packing it * into a wire format, application can free it inside * :type:`nghttp2_pack_extension_callback2`. * * The standard HTTP/2 frame cannot be sent with this function, so * |type| must be strictly grater than 0x9. Otherwise, this function * will fail with error code * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT`. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` * If :type:`nghttp2_pack_extension_callback2` is not set. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * If |type| specifies standard HTTP/2 frame type. The frame * types in the rage [0x0, 0x9], both inclusive, are standard * HTTP/2 frame type, and cannot be sent using this function. * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory */ NGHTTP2_EXTERN int nghttp2_submit_extension(nghttp2_session *session, uint8_t type, uint8_t flags, int32_t stream_id, void *payload); /** * @struct * * The payload of ALTSVC frame. ALTSVC frame is a non-critical * extension to HTTP/2. If this frame is received, and * `nghttp2_option_set_user_recv_extension_type()` is not set, and * `nghttp2_option_set_builtin_recv_extension_type()` is set for * :enum:`nghttp2_frame_type.NGHTTP2_ALTSVC`, * ``nghttp2_extension.payload`` will point to this struct. * * It has the following members: */ typedef struct { /** * The pointer to origin which this alternative service is * associated with. This is not necessarily NULL-terminated. */ uint8_t *origin; /** * The length of the |origin|. */ size_t origin_len; /** * The pointer to Alt-Svc field value contained in ALTSVC frame. * This is not necessarily NULL-terminated. */ uint8_t *field_value; /** * The length of the |field_value|. */ size_t field_value_len; } nghttp2_ext_altsvc; /** * @function * * Submits ALTSVC frame. * * ALTSVC frame is a non-critical extension to HTTP/2, and defined in * `RFC 7383 `_. * * The |flags| is currently ignored and should be * :enum:`nghttp2_flag.NGHTTP2_FLAG_NONE`. * * The |origin| points to the origin this alternative service is * associated with. The |origin_len| is the length of the origin. If * |stream_id| is 0, the origin must be specified. If |stream_id| is * not zero, the origin must be empty (in other words, |origin_len| * must be 0). * * The ALTSVC frame is only usable from server side. If this function * is invoked with client side session, this function returns * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE`. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` * The function is called from client side session * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The sum of |origin_len| and |field_value_len| is larger than * 16382; or |origin_len| is 0 while |stream_id| is 0; or * |origin_len| is not 0 while |stream_id| is not 0. */ NGHTTP2_EXTERN int nghttp2_submit_altsvc(nghttp2_session *session, uint8_t flags, int32_t stream_id, const uint8_t *origin, size_t origin_len, const uint8_t *field_value, size_t field_value_len); /** * @struct * * The single entry of an origin. */ typedef struct { /** * The pointer to origin. No validation is made against this field * by the library. This is not necessarily NULL-terminated. */ uint8_t *origin; /** * The length of the |origin|. */ size_t origin_len; } nghttp2_origin_entry; /** * @struct * * The payload of ORIGIN frame. ORIGIN frame is a non-critical * extension to HTTP/2 and defined by `RFC 8336 * `_. * * If this frame is received, and * `nghttp2_option_set_user_recv_extension_type()` is not set, and * `nghttp2_option_set_builtin_recv_extension_type()` is set for * :enum:`nghttp2_frame_type.NGHTTP2_ORIGIN`, * ``nghttp2_extension.payload`` will point to this struct. * * It has the following members: */ typedef struct { /** * The number of origins contained in |ov|. */ size_t nov; /** * The pointer to the array of origins contained in ORIGIN frame. */ nghttp2_origin_entry *ov; } nghttp2_ext_origin; /** * @function * * Submits ORIGIN frame. * * ORIGIN frame is a non-critical extension to HTTP/2 and defined by * `RFC 8336 `_. * * The |flags| is currently ignored and should be * :enum:`nghttp2_flag.NGHTTP2_FLAG_NONE`. * * The |ov| points to the array of origins. The |nov| specifies the * number of origins included in |ov|. This function creates copies * of all elements in |ov|. * * The ORIGIN frame is only usable by a server. If this function is * invoked with client side session, this function returns * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE`. * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` * The function is called from client side session. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * There are too many origins, or an origin is too large to fit * into a default frame payload. */ NGHTTP2_EXTERN int nghttp2_submit_origin(nghttp2_session *session, uint8_t flags, const nghttp2_origin_entry *ov, size_t nov); /** * @struct * * The payload of PRIORITY_UPDATE frame. PRIORITY_UPDATE frame is a * non-critical extension to HTTP/2. If this frame is received, and * `nghttp2_option_set_user_recv_extension_type()` is not set, and * `nghttp2_option_set_builtin_recv_extension_type()` is set for * :enum:`nghttp2_frame_type.NGHTTP2_PRIORITY_UPDATE`, * ``nghttp2_extension.payload`` will point to this struct. * * It has the following members: */ typedef struct { /** * The stream ID of the stream whose priority is updated. */ int32_t stream_id; /** * The pointer to Priority field value. It is not necessarily * NULL-terminated. */ uint8_t *field_value; /** * The length of the :member:`field_value`. */ size_t field_value_len; } nghttp2_ext_priority_update; /** * @function * * Submits PRIORITY_UPDATE frame. * * PRIORITY_UPDATE frame is a non-critical extension to HTTP/2, and * defined in :rfc:`9218#section-7.1`. * * The |flags| is currently ignored and should be * :enum:`nghttp2_flag.NGHTTP2_FLAG_NONE`. * * The |stream_id| is the ID of stream which is prioritized. The * |field_value| points to the Priority field value. The * |field_value_len| is the length of the Priority field value. * * If this function is called by server, * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` is returned. * * If * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` * of value of 0 is received by a remote endpoint (or it is omitted), * this function does nothing and returns 0. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` * The function is called from server side session * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * The |field_value_len| is larger than 16380; or |stream_id| is * 0. */ NGHTTP2_EXTERN int nghttp2_submit_priority_update(nghttp2_session *session, uint8_t flags, int32_t stream_id, const uint8_t *field_value, size_t field_value_len); /** * @function * * Changes the priority of the existing stream denoted by |stream_id|. * The new priority is |extpri|. This function is meant to be used by * server for :rfc:`9218` extensible prioritization scheme. * * If |session| is initialized as client, this function returns * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE`. For client, use * `nghttp2_submit_priority_update()` instead. * * If :member:`extpri->urgency ` is out of * bound, it is set to :macro:`NGHTTP2_EXTPRI_URGENCY_LOW`. * * If |ignore_client_signal| is nonzero, server starts to ignore * client priority signals for this stream. * * If * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` * of value of 1 is not submitted via `nghttp2_submit_settings()`, * this function does nothing and returns 0. * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` * The |session| is initialized as client. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * |stream_id| is zero; or a stream denoted by |stream_id| is not * found. */ NGHTTP2_EXTERN int nghttp2_session_change_extpri_stream_priority( nghttp2_session *session, int32_t stream_id, const nghttp2_extpri *extpri, int ignore_client_signal); /** * @function * * Stores the stream priority of the existing stream denoted by * |stream_id| in the object pointed by |extpri|. This function is * meant to be used by server for :rfc:`9218` extensible * prioritization scheme. * * If |session| is initialized as client, this function returns * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE`. * * If * :enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` * of value of 1 is not submitted via `nghttp2_submit_settings()`, * this function does nothing and returns 0. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` * The |session| is initialized as client. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * |stream_id| is zero; or a stream denoted by |stream_id| is not * found. */ NGHTTP2_EXTERN int nghttp2_session_get_extpri_stream_priority( nghttp2_session *session, nghttp2_extpri *extpri, int32_t stream_id); /** * @function * * Parses Priority header field value pointed by |value| of length * |len|, and stores the result in the object pointed by |extpri|. * Priority header field is defined in :rfc:`9218`. * * This function does not initialize the object pointed by |extpri| * before storing the result. It only assigns the values that the * parser correctly extracted to fields. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_ARGUMENT` * Failed to parse the header field value. */ NGHTTP2_EXTERN int nghttp2_extpri_parse_priority(nghttp2_extpri *extpri, const uint8_t *value, size_t len); /** * @function * * Compares ``lhs->name`` of length ``lhs->namelen`` bytes and * ``rhs->name`` of length ``rhs->namelen`` bytes. Returns negative * integer if ``lhs->name`` is found to be less than ``rhs->name``; or * returns positive integer if ``lhs->name`` is found to be greater * than ``rhs->name``; or returns 0 otherwise. */ NGHTTP2_EXTERN int nghttp2_nv_compare_name(const nghttp2_nv *lhs, const nghttp2_nv *rhs); /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_select_alpn` instead. * * A helper function for dealing with ALPN in server side. The |in| * contains peer's protocol list in preferable order. The format of * |in| is length-prefixed and not null-terminated. For example, * ``h2`` and ``http/1.1`` stored in |in| like this:: * * in[0] = 2 * in[1..2] = "h2" * in[3] = 8 * in[4..11] = "http/1.1" * inlen = 12 * * The selection algorithm is as follows: * * 1. If peer's list contains HTTP/2 protocol the library supports, * it is selected and returns 1. The following step is not taken. * * 2. If peer's list contains ``http/1.1``, this function selects * ``http/1.1`` and returns 0. The following step is not taken. * * 3. This function selects nothing and returns -1 (So called * non-overlap case). In this case, |out| and |outlen| are left * untouched. * * Selecting ``h2`` means that ``h2`` is written into |*out| and its * length (which is 2) is assigned to |*outlen|. * * For ALPN, refer to https://tools.ietf.org/html/rfc7301 * * To use this method you should do something like:: * * static int alpn_select_proto_cb(SSL* ssl, * const unsigned char **out, * unsigned char *outlen, * const unsigned char *in, * unsigned int inlen, * void *arg) * { * int rv; * rv = nghttp2_select_next_protocol((unsigned char**)out, outlen, * in, inlen); * if (rv == -1) { * return SSL_TLSEXT_ERR_NOACK; * } * if (rv == 1) { * ((MyType*)arg)->http2_selected = 1; * } * return SSL_TLSEXT_ERR_OK; * } * ... * SSL_CTX_set_alpn_select_cb(ssl_ctx, alpn_select_proto_cb, my_obj); * */ NGHTTP2_EXTERN int nghttp2_select_next_protocol(unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen); /** * @function * * A helper function for dealing with ALPN in server side. The |in| * contains peer's protocol list in preferable order. The format of * |in| is length-prefixed and not null-terminated. For example, * ``h2`` and ``http/1.1`` stored in |in| like this:: * * in[0] = 2 * in[1..2] = "h2" * in[3] = 8 * in[4..11] = "http/1.1" * inlen = 12 * * The selection algorithm is as follows: * * 1. If peer's list contains HTTP/2 protocol the library supports, * it is selected and returns 1. The following step is not taken. * * 2. If peer's list contains ``http/1.1``, this function selects * ``http/1.1`` and returns 0. The following step is not taken. * * 3. This function selects nothing and returns -1 (So called * non-overlap case). In this case, |out| and |outlen| are left * untouched. * * Selecting ``h2`` means that ``h2`` is written into |*out| and its * length (which is 2) is assigned to |*outlen|. * * For ALPN, refer to https://tools.ietf.org/html/rfc7301 * * To use this method you should do something like:: * * static int alpn_select_proto_cb(SSL* ssl, * const unsigned char **out, * unsigned char *outlen, * const unsigned char *in, * unsigned int inlen, * void *arg) * { * int rv; * rv = nghttp2_select_alpn(out, outlen, in, inlen); * if (rv == -1) { * return SSL_TLSEXT_ERR_NOACK; * } * if (rv == 1) { * ((MyType*)arg)->http2_selected = 1; * } * return SSL_TLSEXT_ERR_OK; * } * ... * SSL_CTX_set_alpn_select_cb(ssl_ctx, alpn_select_proto_cb, my_obj); * */ NGHTTP2_EXTERN int nghttp2_select_alpn(const unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen); /** * @function * * Returns a pointer to a nghttp2_info struct with version information * about the run-time library in use. The |least_version| argument * can be set to a 24 bit numerical value for the least accepted * version number and if the condition is not met, this function will * return a ``NULL``. Pass in 0 to skip the version checking. */ NGHTTP2_EXTERN nghttp2_info *nghttp2_version(int least_version); /** * @function * * Returns nonzero if the :type:`nghttp2_error` library error code * |lib_error| is fatal. */ NGHTTP2_EXTERN int nghttp2_is_fatal(int lib_error_code); /** * @function * * Returns nonzero if HTTP header field name |name| of length |len| is * valid according to http://tools.ietf.org/html/rfc7230#section-3.2 * * Because this is a header field name in HTTP2, the upper cased alphabet * is treated as error. */ NGHTTP2_EXTERN int nghttp2_check_header_name(const uint8_t *name, size_t len); /** * @function * * Returns nonzero if HTTP header field value |value| of length |len| * is valid according to * http://tools.ietf.org/html/rfc7230#section-3.2 * * This function is considered obsolete, and application should * consider to use `nghttp2_check_header_value_rfc9113()` instead. */ NGHTTP2_EXTERN int nghttp2_check_header_value(const uint8_t *value, size_t len); /** * @function * * Returns nonzero if HTTP header field value |value| of length |len| * is valid according to * http://tools.ietf.org/html/rfc7230#section-3.2, plus * https://datatracker.ietf.org/doc/html/rfc9113#section-8.2.1 */ NGHTTP2_EXTERN int nghttp2_check_header_value_rfc9113(const uint8_t *value, size_t len); /** * @function * * Returns nonzero if the |value| which is supposed to be the value of * the :method header field is valid according to * https://datatracker.ietf.org/doc/html/rfc7231#section-4 and * https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.6 */ NGHTTP2_EXTERN int nghttp2_check_method(const uint8_t *value, size_t len); /** * @function * * Returns nonzero if the |value| which is supposed to be the value of * the :path header field is valid according to * https://datatracker.ietf.org/doc/html/rfc7540#section-8.1.2.3 * * |value| is valid if it merely consists of the allowed characters. * In particular, it does not check whether |value| follows the syntax * of path. The allowed characters are all characters valid by * `nghttp2_check_header_value` minus SPC and HT. */ NGHTTP2_EXTERN int nghttp2_check_path(const uint8_t *value, size_t len); /** * @function * * Returns nonzero if the |value| which is supposed to be the value of the * :authority or host header field is valid according to * https://tools.ietf.org/html/rfc3986#section-3.2 * * |value| is valid if it merely consists of the allowed characters. * In particular, it does not check whether |value| follows the syntax * of authority. */ NGHTTP2_EXTERN int nghttp2_check_authority(const uint8_t *value, size_t len); /* HPACK API */ struct nghttp2_hd_deflater; /** * @struct * * HPACK deflater object. */ typedef struct nghttp2_hd_deflater nghttp2_hd_deflater; /** * @function * * Initializes |*deflater_ptr| for deflating name/values pairs. * * The |max_deflate_dynamic_table_size| is the upper bound of header * table size the deflater will use. * * If this function fails, |*deflater_ptr| is left untouched. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_hd_deflate_new(nghttp2_hd_deflater **deflater_ptr, size_t max_deflate_dynamic_table_size); /** * @function * * Like `nghttp2_hd_deflate_new()`, but with additional custom memory * allocator specified in the |mem|. * * The |mem| can be ``NULL`` and the call is equivalent to * `nghttp2_hd_deflate_new()`. * * This function does not take ownership |mem|. The application is * responsible for freeing |mem|. * * The library code does not refer to |mem| pointer after this * function returns, so the application can safely free it. */ NGHTTP2_EXTERN int nghttp2_hd_deflate_new2(nghttp2_hd_deflater **deflater_ptr, size_t max_deflate_dynamic_table_size, nghttp2_mem *mem); /** * @function * * Deallocates any resources allocated for |deflater|. */ NGHTTP2_EXTERN void nghttp2_hd_deflate_del(nghttp2_hd_deflater *deflater); /** * @function * * Changes header table size of the |deflater| to * |settings_max_dynamic_table_size| bytes. This may trigger eviction * in the dynamic table. * * The |settings_max_dynamic_table_size| should be the value received * in SETTINGS_HEADER_TABLE_SIZE. * * The deflater never uses more memory than * ``max_deflate_dynamic_table_size`` bytes specified in * `nghttp2_hd_deflate_new()`. Therefore, if * |settings_max_dynamic_table_size| > * ``max_deflate_dynamic_table_size``, resulting maximum table size * becomes ``max_deflate_dynamic_table_size``. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_hd_deflate_change_table_size(nghttp2_hd_deflater *deflater, size_t settings_max_dynamic_table_size); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_hd_deflate_hd2()` instead. * * Deflates the |nva|, which has the |nvlen| name/value pairs, into * the |buf| of length |buflen|. * * If |buf| is not large enough to store the deflated header block, * this function fails with * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE`. The caller * should use `nghttp2_hd_deflate_bound()` to know the upper bound of * buffer size required to deflate given header name/value pairs. * * Once this function fails, subsequent call of this function always * returns :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP`. * * After this function returns, it is safe to delete the |nva|. * * This function returns the number of bytes written to |buf| if it * succeeds, or one of the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP` * Deflation process has failed. * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE` * The provided |buflen| size is too small to hold the output. */ NGHTTP2_EXTERN ssize_t nghttp2_hd_deflate_hd(nghttp2_hd_deflater *deflater, uint8_t *buf, size_t buflen, const nghttp2_nv *nva, size_t nvlen); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Deflates the |nva|, which has the |nvlen| name/value pairs, into * the |buf| of length |buflen|. * * If |buf| is not large enough to store the deflated header block, * this function fails with * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE`. The caller * should use `nghttp2_hd_deflate_bound()` to know the upper bound of * buffer size required to deflate given header name/value pairs. * * Once this function fails, subsequent call of this function always * returns :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP`. * * After this function returns, it is safe to delete the |nva|. * * This function returns the number of bytes written to |buf| if it * succeeds, or one of the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP` * Deflation process has failed. * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE` * The provided |buflen| size is too small to hold the output. */ NGHTTP2_EXTERN nghttp2_ssize nghttp2_hd_deflate_hd2(nghttp2_hd_deflater *deflater, uint8_t *buf, size_t buflen, const nghttp2_nv *nva, size_t nvlen); #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_hd_deflate_hd_vec2()` instead. * * Deflates the |nva|, which has the |nvlen| name/value pairs, into * the |veclen| size of buf vector |vec|. The each size of buffer * must be set in len field of :type:`nghttp2_vec`. If and only if * one chunk is filled up completely, next chunk will be used. If * |vec| is not large enough to store the deflated header block, this * function fails with * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE`. The caller * should use `nghttp2_hd_deflate_bound()` to know the upper bound of * buffer size required to deflate given header name/value pairs. * * Once this function fails, subsequent call of this function always * returns :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP`. * * After this function returns, it is safe to delete the |nva|. * * This function returns the number of bytes written to |vec| if it * succeeds, or one of the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP` * Deflation process has failed. * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE` * The provided |buflen| size is too small to hold the output. */ NGHTTP2_EXTERN ssize_t nghttp2_hd_deflate_hd_vec(nghttp2_hd_deflater *deflater, const nghttp2_vec *vec, size_t veclen, const nghttp2_nv *nva, size_t nvlen); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Deflates the |nva|, which has the |nvlen| name/value pairs, into * the |veclen| size of buf vector |vec|. The each size of buffer * must be set in len field of :type:`nghttp2_vec`. If and only if * one chunk is filled up completely, next chunk will be used. If * |vec| is not large enough to store the deflated header block, this * function fails with * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE`. The caller * should use `nghttp2_hd_deflate_bound()` to know the upper bound of * buffer size required to deflate given header name/value pairs. * * Once this function fails, subsequent call of this function always * returns :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP`. * * After this function returns, it is safe to delete the |nva|. * * This function returns the number of bytes written to |vec| if it * succeeds, or one of the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP` * Deflation process has failed. * :enum:`nghttp2_error.NGHTTP2_ERR_INSUFF_BUFSIZE` * The provided |buflen| size is too small to hold the output. */ NGHTTP2_EXTERN nghttp2_ssize nghttp2_hd_deflate_hd_vec2( nghttp2_hd_deflater *deflater, const nghttp2_vec *vec, size_t veclen, const nghttp2_nv *nva, size_t nvlen); /** * @function * * Returns an upper bound on the compressed size after deflation of * |nva| of length |nvlen|. */ NGHTTP2_EXTERN size_t nghttp2_hd_deflate_bound(nghttp2_hd_deflater *deflater, const nghttp2_nv *nva, size_t nvlen); /** * @function * * Returns the number of entries that header table of |deflater| * contains. This is the sum of the number of static table and * dynamic table, so the return value is at least 61. */ NGHTTP2_EXTERN size_t nghttp2_hd_deflate_get_num_table_entries(nghttp2_hd_deflater *deflater); /** * @function * * Returns the table entry denoted by |idx| from header table of * |deflater|. The |idx| is 1-based, and idx=1 returns first entry of * static table. idx=62 returns first entry of dynamic table if it * exists. Specifying idx=0 is error, and this function returns NULL. * If |idx| is strictly greater than the number of entries the tables * contain, this function returns NULL. */ NGHTTP2_EXTERN const nghttp2_nv * nghttp2_hd_deflate_get_table_entry(nghttp2_hd_deflater *deflater, size_t idx); /** * @function * * Returns the used dynamic table size, including the overhead 32 * bytes per entry described in RFC 7541. */ NGHTTP2_EXTERN size_t nghttp2_hd_deflate_get_dynamic_table_size(nghttp2_hd_deflater *deflater); /** * @function * * Returns the maximum dynamic table size. */ NGHTTP2_EXTERN size_t nghttp2_hd_deflate_get_max_dynamic_table_size(nghttp2_hd_deflater *deflater); struct nghttp2_hd_inflater; /** * @struct * * HPACK inflater object. */ typedef struct nghttp2_hd_inflater nghttp2_hd_inflater; /** * @function * * Initializes |*inflater_ptr| for inflating name/values pairs. * * If this function fails, |*inflater_ptr| is left untouched. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. */ NGHTTP2_EXTERN int nghttp2_hd_inflate_new(nghttp2_hd_inflater **inflater_ptr); /** * @function * * Like `nghttp2_hd_inflate_new()`, but with additional custom memory * allocator specified in the |mem|. * * The |mem| can be ``NULL`` and the call is equivalent to * `nghttp2_hd_inflate_new()`. * * This function does not take ownership |mem|. The application is * responsible for freeing |mem|. * * The library code does not refer to |mem| pointer after this * function returns, so the application can safely free it. */ NGHTTP2_EXTERN int nghttp2_hd_inflate_new2(nghttp2_hd_inflater **inflater_ptr, nghttp2_mem *mem); /** * @function * * Deallocates any resources allocated for |inflater|. */ NGHTTP2_EXTERN void nghttp2_hd_inflate_del(nghttp2_hd_inflater *inflater); /** * @function * * Changes header table size in the |inflater|. This may trigger * eviction in the dynamic table. * * The |settings_max_dynamic_table_size| should be the value * transmitted in SETTINGS_HEADER_TABLE_SIZE. * * This function must not be called while header block is being * inflated. In other words, this function must be called after * initialization of |inflater|, but before calling * `nghttp2_hd_inflate_hd3()`, or after * `nghttp2_hd_inflate_end_headers()`. Otherwise, * `NGHTTP2_ERR_INVALID_STATE` was returned. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_INVALID_STATE` * The function is called while header block is being inflated. * Probably, application missed to call * `nghttp2_hd_inflate_end_headers()`. */ NGHTTP2_EXTERN int nghttp2_hd_inflate_change_table_size(nghttp2_hd_inflater *inflater, size_t settings_max_dynamic_table_size); /** * @enum * * The flags for header inflation. */ typedef enum { /** * No flag set. */ NGHTTP2_HD_INFLATE_NONE = 0, /** * Indicates all headers were inflated. */ NGHTTP2_HD_INFLATE_FINAL = 0x01, /** * Indicates a header was emitted. */ NGHTTP2_HD_INFLATE_EMIT = 0x02 } nghttp2_hd_inflate_flag; #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_hd_inflate_hd2()` instead. * * Inflates name/value block stored in |in| with length |inlen|. This * function performs decompression. For each successful emission of * header name/value pair, * :enum:`nghttp2_hd_inflate_flag.NGHTTP2_HD_INFLATE_EMIT` is set in * |*inflate_flags| and name/value pair is assigned to the |nv_out| * and the function returns. The caller must not free the members of * |nv_out|. * * The |nv_out| may include pointers to the memory region in the |in|. * The caller must retain the |in| while the |nv_out| is used. * * The application should call this function repeatedly until the * ``(*inflate_flags) & NGHTTP2_HD_INFLATE_FINAL`` is nonzero and * return value is non-negative. This means the all input values are * processed successfully. Then the application must call * `nghttp2_hd_inflate_end_headers()` to prepare for the next header * block input. * * The caller can feed complete compressed header block. It also can * feed it in several chunks. The caller must set |in_final| to * nonzero if the given input is the last block of the compressed * header. * * This function returns the number of bytes processed if it succeeds, * or one of the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP` * Inflation process has failed. * :enum:`nghttp2_error.NGHTTP2_ERR_BUFFER_ERROR` * The header field name or value is too large. * * Example follows:: * * int inflate_header_block(nghttp2_hd_inflater *hd_inflater, * uint8_t *in, size_t inlen, int final) * { * ssize_t rv; * * for(;;) { * nghttp2_nv nv; * int inflate_flags = 0; * * rv = nghttp2_hd_inflate_hd(hd_inflater, &nv, &inflate_flags, * in, inlen, final); * * if(rv < 0) { * fprintf(stderr, "inflate failed with error code %zd", rv); * return -1; * } * * in += rv; * inlen -= rv; * * if(inflate_flags & NGHTTP2_HD_INFLATE_EMIT) { * fwrite(nv.name, nv.namelen, 1, stderr); * fprintf(stderr, ": "); * fwrite(nv.value, nv.valuelen, 1, stderr); * fprintf(stderr, "\n"); * } * if(inflate_flags & NGHTTP2_HD_INFLATE_FINAL) { * nghttp2_hd_inflate_end_headers(hd_inflater); * break; * } * if((inflate_flags & NGHTTP2_HD_INFLATE_EMIT) == 0 && * inlen == 0) { * break; * } * } * * return 0; * } * */ NGHTTP2_EXTERN ssize_t nghttp2_hd_inflate_hd(nghttp2_hd_inflater *inflater, nghttp2_nv *nv_out, int *inflate_flags, uint8_t *in, size_t inlen, int in_final); #endif /* NGHTTP2_NO_SSIZE_T */ #ifndef NGHTTP2_NO_SSIZE_T /** * @function * * .. warning:: * * Deprecated. Use `nghttp2_hd_inflate_hd3()` instead. * * Inflates name/value block stored in |in| with length |inlen|. This * function performs decompression. For each successful emission of * header name/value pair, * :enum:`nghttp2_hd_inflate_flag.NGHTTP2_HD_INFLATE_EMIT` is set in * |*inflate_flags| and name/value pair is assigned to the |nv_out| * and the function returns. The caller must not free the members of * |nv_out|. * * The |nv_out| may include pointers to the memory region in the |in|. * The caller must retain the |in| while the |nv_out| is used. * * The application should call this function repeatedly until the * ``(*inflate_flags) & NGHTTP2_HD_INFLATE_FINAL`` is nonzero and * return value is non-negative. If that happens, all given input * data (|inlen| bytes) are processed successfully. Then the * application must call `nghttp2_hd_inflate_end_headers()` to prepare * for the next header block input. * * In other words, if |in_final| is nonzero, and this function returns * |inlen|, you can assert that * :enum:`nghttp2_hd_inflate_final.NGHTTP2_HD_INFLATE_FINAL` is set in * |*inflate_flags|. * * The caller can feed complete compressed header block. It also can * feed it in several chunks. The caller must set |in_final| to * nonzero if the given input is the last block of the compressed * header. * * This function returns the number of bytes processed if it succeeds, * or one of the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP` * Inflation process has failed. * :enum:`nghttp2_error.NGHTTP2_ERR_BUFFER_ERROR` * The header field name or value is too large. * * Example follows:: * * int inflate_header_block(nghttp2_hd_inflater *hd_inflater, * uint8_t *in, size_t inlen, int final) * { * ssize_t rv; * * for(;;) { * nghttp2_nv nv; * int inflate_flags = 0; * * rv = nghttp2_hd_inflate_hd2(hd_inflater, &nv, &inflate_flags, * in, inlen, final); * * if(rv < 0) { * fprintf(stderr, "inflate failed with error code %zd", rv); * return -1; * } * * in += rv; * inlen -= rv; * * if(inflate_flags & NGHTTP2_HD_INFLATE_EMIT) { * fwrite(nv.name, nv.namelen, 1, stderr); * fprintf(stderr, ": "); * fwrite(nv.value, nv.valuelen, 1, stderr); * fprintf(stderr, "\n"); * } * if(inflate_flags & NGHTTP2_HD_INFLATE_FINAL) { * nghttp2_hd_inflate_end_headers(hd_inflater); * break; * } * if((inflate_flags & NGHTTP2_HD_INFLATE_EMIT) == 0 && * inlen == 0) { * break; * } * } * * return 0; * } * */ NGHTTP2_EXTERN ssize_t nghttp2_hd_inflate_hd2(nghttp2_hd_inflater *inflater, nghttp2_nv *nv_out, int *inflate_flags, const uint8_t *in, size_t inlen, int in_final); #endif /* NGHTTP2_NO_SSIZE_T */ /** * @function * * Inflates name/value block stored in |in| with length |inlen|. This * function performs decompression. For each successful emission of * header name/value pair, * :enum:`nghttp2_hd_inflate_flag.NGHTTP2_HD_INFLATE_EMIT` is set in * |*inflate_flags| and name/value pair is assigned to the |nv_out| * and the function returns. The caller must not free the members of * |nv_out|. * * The |nv_out| may include pointers to the memory region in the |in|. * The caller must retain the |in| while the |nv_out| is used. * * The application should call this function repeatedly until the * ``(*inflate_flags) & NGHTTP2_HD_INFLATE_FINAL`` is nonzero and * return value is non-negative. If that happens, all given input * data (|inlen| bytes) are processed successfully. Then the * application must call `nghttp2_hd_inflate_end_headers()` to prepare * for the next header block input. * * In other words, if |in_final| is nonzero, and this function returns * |inlen|, you can assert that * :enum:`nghttp2_hd_inflate_final.NGHTTP2_HD_INFLATE_FINAL` is set in * |*inflate_flags|. * * The caller can feed complete compressed header block. It also can * feed it in several chunks. The caller must set |in_final| to * nonzero if the given input is the last block of the compressed * header. * * This function returns the number of bytes processed if it succeeds, * or one of the following negative error codes: * * :enum:`nghttp2_error.NGHTTP2_ERR_NOMEM` * Out of memory. * :enum:`nghttp2_error.NGHTTP2_ERR_HEADER_COMP` * Inflation process has failed. * :enum:`nghttp2_error.NGHTTP2_ERR_BUFFER_ERROR` * The header field name or value is too large. * * Example follows:: * * int inflate_header_block(nghttp2_hd_inflater *hd_inflater, * uint8_t *in, size_t inlen, int final) * { * nghttp2_ssize rv; * * for(;;) { * nghttp2_nv nv; * int inflate_flags = 0; * * rv = nghttp2_hd_inflate_hd3(hd_inflater, &nv, &inflate_flags, * in, inlen, final); * * if(rv < 0) { * fprintf(stderr, "inflate failed with error code %td", rv); * return -1; * } * * in += rv; * inlen -= rv; * * if(inflate_flags & NGHTTP2_HD_INFLATE_EMIT) { * fwrite(nv.name, nv.namelen, 1, stderr); * fprintf(stderr, ": "); * fwrite(nv.value, nv.valuelen, 1, stderr); * fprintf(stderr, "\n"); * } * if(inflate_flags & NGHTTP2_HD_INFLATE_FINAL) { * nghttp2_hd_inflate_end_headers(hd_inflater); * break; * } * if((inflate_flags & NGHTTP2_HD_INFLATE_EMIT) == 0 && * inlen == 0) { * break; * } * } * * return 0; * } * */ NGHTTP2_EXTERN nghttp2_ssize nghttp2_hd_inflate_hd3( nghttp2_hd_inflater *inflater, nghttp2_nv *nv_out, int *inflate_flags, const uint8_t *in, size_t inlen, int in_final); /** * @function * * Signals the end of decompression for one header block. * * This function returns 0 if it succeeds. Currently this function * always succeeds. */ NGHTTP2_EXTERN int nghttp2_hd_inflate_end_headers(nghttp2_hd_inflater *inflater); /** * @function * * Returns the number of entries that header table of |inflater| * contains. This is the sum of the number of static table and * dynamic table, so the return value is at least 61. */ NGHTTP2_EXTERN size_t nghttp2_hd_inflate_get_num_table_entries(nghttp2_hd_inflater *inflater); /** * @function * * Returns the table entry denoted by |idx| from header table of * |inflater|. The |idx| is 1-based, and idx=1 returns first entry of * static table. idx=62 returns first entry of dynamic table if it * exists. Specifying idx=0 is error, and this function returns NULL. * If |idx| is strictly greater than the number of entries the tables * contain, this function returns NULL. */ NGHTTP2_EXTERN const nghttp2_nv * nghttp2_hd_inflate_get_table_entry(nghttp2_hd_inflater *inflater, size_t idx); /** * @function * * Returns the used dynamic table size, including the overhead 32 * bytes per entry described in RFC 7541. */ NGHTTP2_EXTERN size_t nghttp2_hd_inflate_get_dynamic_table_size(nghttp2_hd_inflater *inflater); /** * @function * * Returns the maximum dynamic table size. */ NGHTTP2_EXTERN size_t nghttp2_hd_inflate_get_max_dynamic_table_size(nghttp2_hd_inflater *inflater); struct nghttp2_stream; /** * @struct * * The structure to represent HTTP/2 stream. The details of this * structure are intentionally hidden from the public API. */ typedef struct nghttp2_stream nghttp2_stream; /** * @function * * Returns pointer to :type:`nghttp2_stream` object denoted by * |stream_id|. If stream was not found, returns NULL. * * Returns imaginary root stream (see * `nghttp2_session_get_root_stream()`) if 0 is given in |stream_id|. * * Unless |stream_id| == 0, the returned pointer is valid until next * call of `nghttp2_session_send()`, `nghttp2_session_mem_send2()`, * `nghttp2_session_recv()`, and `nghttp2_session_mem_recv2()`. */ NGHTTP2_EXTERN nghttp2_stream * nghttp2_session_find_stream(nghttp2_session *session, int32_t stream_id); /** * @enum * * State of stream as described in RFC 7540. */ typedef enum { /** * idle state. */ NGHTTP2_STREAM_STATE_IDLE = 1, /** * open state. */ NGHTTP2_STREAM_STATE_OPEN, /** * reserved (local) state. */ NGHTTP2_STREAM_STATE_RESERVED_LOCAL, /** * reserved (remote) state. */ NGHTTP2_STREAM_STATE_RESERVED_REMOTE, /** * half closed (local) state. */ NGHTTP2_STREAM_STATE_HALF_CLOSED_LOCAL, /** * half closed (remote) state. */ NGHTTP2_STREAM_STATE_HALF_CLOSED_REMOTE, /** * closed state. */ NGHTTP2_STREAM_STATE_CLOSED } nghttp2_stream_proto_state; /** * @function * * Returns state of |stream|. The root stream retrieved by * `nghttp2_session_get_root_stream()` will have stream state * :enum:`nghttp2_stream_proto_state.NGHTTP2_STREAM_STATE_IDLE`. */ NGHTTP2_EXTERN nghttp2_stream_proto_state nghttp2_stream_get_state(nghttp2_stream *stream); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. * * Returns root of dependency tree, which is imaginary stream with * stream ID 0. The returned pointer is valid until |session| is * freed by `nghttp2_session_del()`. */ NGHTTP2_EXTERN nghttp2_stream * nghttp2_session_get_root_stream(nghttp2_session *session); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. In the future release after the end of * 2024, this function will always return NULL. * * Returns the parent stream of |stream| in dependency tree. Returns * NULL if there is no such stream. */ NGHTTP2_EXTERN nghttp2_stream * nghttp2_stream_get_parent(nghttp2_stream *stream); NGHTTP2_EXTERN int32_t nghttp2_stream_get_stream_id(nghttp2_stream *stream); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. In the future release after the end of * 2024, this function will always return NULL. * * Returns the next sibling stream of |stream| in dependency tree. * Returns NULL if there is no such stream. */ NGHTTP2_EXTERN nghttp2_stream * nghttp2_stream_get_next_sibling(nghttp2_stream *stream); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. In the future release after the end of * 2024, this function will always return NULL. * * Returns the previous sibling stream of |stream| in dependency tree. * Returns NULL if there is no such stream. */ NGHTTP2_EXTERN nghttp2_stream * nghttp2_stream_get_previous_sibling(nghttp2_stream *stream); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. In the future release after the end of * 2024, this function will always return NULL. * * Returns the first child stream of |stream| in dependency tree. * Returns NULL if there is no such stream. */ NGHTTP2_EXTERN nghttp2_stream * nghttp2_stream_get_first_child(nghttp2_stream *stream); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. In the future release after the end of * 2024, this function will always return * :macro:`NGHTTP2_DEFAULT_WEIGHT`. * * Returns dependency weight to the parent stream of |stream|. */ NGHTTP2_EXTERN int32_t nghttp2_stream_get_weight(nghttp2_stream *stream); /** * @function * * .. warning:: * * Deprecated. :rfc:`7540` priorities are deprecated by * :rfc:`9113`. Consider migrating to :rfc:`9218` extensible * prioritization scheme. In the future release after the end of * 2024, this function will always return 0. * * Returns the sum of the weight for |stream|'s children. */ NGHTTP2_EXTERN int32_t nghttp2_stream_get_sum_dependency_weight(nghttp2_stream *stream); /** * @functypedef * * Callback function invoked when the library outputs debug logging. * The function is called with arguments suitable for ``vfprintf(3)`` * * The debug output is only enabled if the library is built with * ``DEBUGBUILD`` macro defined. */ typedef void (*nghttp2_debug_vprintf_callback)(const char *format, va_list args); /** * @function * * Sets a debug output callback called by the library when built with * ``DEBUGBUILD`` macro defined. If this option is not used, debug * log is written into standard error output. * * For builds without ``DEBUGBUILD`` macro defined, this function is * noop. * * Note that building with ``DEBUGBUILD`` may cause significant * performance penalty to libnghttp2 because of extra processing. It * should be used for debugging purpose only. * * .. Warning:: * * Building with ``DEBUGBUILD`` may cause significant performance * penalty to libnghttp2 because of extra processing. It should be * used for debugging purpose only. We write this two times because * this is important. */ NGHTTP2_EXTERN void nghttp2_set_debug_vprintf_callback( nghttp2_debug_vprintf_callback debug_vprintf_callback); #ifdef __cplusplus } #endif #endif /* NGHTTP2_H */ PK8hZEEinclude/nghttp2/nghttp2ver.hnu[/* * nghttp2 - HTTP/2 C Library * * Copyright (c) 2012, 2013 Tatsuhiro Tsujikawa * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef NGHTTP2VER_H #define NGHTTP2VER_H /** * @macro * Version number of the nghttp2 library release */ #define NGHTTP2_VERSION "1.61.0" /** * @macro * Numerical representation of the version number of the nghttp2 library * release. This is a 24 bit number with 8 bits for major number, 8 bits * for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203. */ #define NGHTTP2_VERSION_NUM 0x013d00 #endif /* NGHTTP2VER_H */ PK8hZL lib/libnghttp2.so.14.28.0nuȯELF> W@ @8@$# HH"H""" ""$$Ptd:::\\QtdRtdHH"H" GNUJ_{Vt$Ǯ5qy  (@((H xXA,9E 2PXM K$&"Gz:)%B`Hч@}L-4!"#&')+/01378:;<=?ACEHILMNQRSTUXYZ]^_acefhjmnpqstuvw{|#IwglAڌO͵jځ*!HuƤ #jjMk3VĽ6R,S֨vLփ_#t>sxH(\=ʈ)3_]9~R!uXu/>H L$͵G RXFe/a.ۮ<bb&@Z}˛yF;&#s͐cXcFi[D;@Q'qOEnx DH8<{ɧYЙwܦ͡gM+O)K~4 _0?ۮ83֮qXmW`]܏.[ vVyM@Yq{:VyM\%0IƲ"o?؊YK"ݬ؜j?`d% k |"h^yޱNVmbjej,ϝl_C|ț Get BE~!V@aR,v#QXcnVR* -' %܈Z-)Am)"wW:{Q_6#'\?O{ɏk`H_N!+YF_iTp3ww u p~t  0 `24 $D f  3Z  @     t{6 `6U  FK  pQj! P 2 D  ? p#E  @4 I   P;jz 2C  P 3H ~1 }V 04 S  8 A 0~@D Ѓ  t   ^ # 1f P t3 C_  @R p  :(@   t  l  \ `5  l   D>H `  5g  EZ 0D  NC Є <  8> #1 @  `("  M<1 w  y 0$   CL $  u& j  9 `. 0u 09 2   P4y  Z 2  EZk Ѕ ` 0 O   <   c #   0"  t  0NF kB d # $  _ ~    @O>   p @ .("    :F PY  u~  9 n  PI" Ч6  1%   0 .  Qjk  @    =67  FA 0 0> 2 p  `B=?   @ ' ) @;  CL  x  @Fqn     9 p F $    p* o    @Mb Ђ lV  NC__gmon_start___fini_ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalize_Jv_RegisterClasses__assert_failstderrfprintfmemsetfreemallocmemcmpnghttp2_priority_spec_default_initnghttp2_priority_spec_initmemcpynghttp2_nv_compare_nameqsortmemmovenghttp2_stream_get_statenghttp2_stream_get_parentnghttp2_stream_get_next_siblingnghttp2_stream_get_previous_siblingnghttp2_stream_get_first_childnghttp2_stream_get_weightnghttp2_stream_get_sum_dependency_weightnghttp2_stream_get_stream_idvsnprintfnghttp2_is_fatalnghttp2_session_client_new3nghttp2_session_client_newnghttp2_session_client_new2nghttp2_session_server_new3nghttp2_session_server_newnghttp2_session_server_new2nghttp2_session_delnghttp2_hd_inflate_change_table_sizenghttp2_session_want_readnghttp2_session_want_writenghttp2_session_check_request_allowedstrlennghttp2_session_terminate_sessionnghttp2_session_terminate_session2nghttp2_hd_deflate_change_table_sizenghttp2_submit_settingsnghttp2_hd_deflate_boundnghttp2_session_mem_send2nghttp2_session_mem_sendnghttp2_session_sendnghttp2_session_get_stream_user_datanghttp2_session_set_stream_user_datanghttp2_session_resume_datanghttp2_session_get_outbound_queue_sizenghttp2_session_get_stream_effective_recv_data_lengthnghttp2_session_get_stream_effective_local_window_sizenghttp2_session_get_stream_local_window_sizenghttp2_session_get_effective_recv_data_lengthnghttp2_session_get_effective_local_window_sizenghttp2_session_get_local_window_sizenghttp2_session_get_stream_remote_window_sizenghttp2_session_get_remote_window_sizenghttp2_session_get_remote_settingsnghttp2_session_get_local_settingsnghttp2_session_upgradenghttp2_session_upgrade2nghttp2_session_get_stream_local_closenghttp2_session_get_stream_remote_closenghttp2_session_consumenghttp2_session_mem_recv2nghttp2_hd_inflate_end_headersnghttp2_session_mem_recvnghttp2_session_recvnghttp2_session_consume_connectionnghttp2_session_consume_streamnghttp2_session_set_next_stream_idnghttp2_session_get_next_stream_idnghttp2_session_get_last_proc_stream_idnghttp2_session_find_streamnghttp2_session_get_root_streamnghttp2_session_check_server_sessionnghttp2_session_change_stream_prioritynghttp2_session_create_idle_streamnghttp2_session_get_hd_inflate_dynamic_table_sizenghttp2_hd_inflate_get_dynamic_table_sizenghttp2_session_get_hd_deflate_dynamic_table_sizenghttp2_hd_deflate_get_dynamic_table_sizenghttp2_session_set_user_datanghttp2_session_change_extpri_stream_prioritynghttp2_session_get_extpri_stream_prioritynghttp2_priority_spec_check_defaultnghttp2_submit_trailernghttp2_submit_headersnghttp2_submit_pingnghttp2_submit_prioritynghttp2_submit_rst_streamnghttp2_submit_goawaynghttp2_submit_shutdown_noticenghttp2_submit_push_promisenghttp2_submit_window_updatenghttp2_session_set_local_window_sizenghttp2_submit_altsvcnghttp2_submit_originnghttp2_submit_priority_updatenghttp2_submit_requestnghttp2_submit_request2nghttp2_submit_responsenghttp2_submit_response2nghttp2_submit_datanghttp2_submit_data2nghttp2_pack_settings_payload2nghttp2_pack_settings_payloadnghttp2_submit_extensionnghttp2_strerrornghttp2_check_header_namenghttp2_check_header_valuenghttp2_check_header_value_rfc9113nghttp2_check_methodnghttp2_check_pathnghttp2_check_authoritynghttp2_http2_strerrornghttp2_select_next_protocolnghttp2_select_alpnnghttp2_rcbuf_decrefnghttp2_rcbuf_increfnghttp2_hd_deflate_hd2nghttp2_hd_deflate_hdnghttp2_hd_deflate_hd_vec2nghttp2_hd_deflate_hd_vecnghttp2_hd_deflate_new2nghttp2_hd_deflate_newnghttp2_hd_deflate_delnghttp2_hd_inflate_hd3nghttp2_hd_inflate_hd2nghttp2_hd_inflate_hdnghttp2_hd_inflate_new2nghttp2_hd_inflate_newnghttp2_hd_inflate_delnghttp2_hd_deflate_get_num_table_entriesnghttp2_hd_deflate_get_table_entrynghttp2_hd_deflate_get_max_dynamic_table_sizenghttp2_hd_inflate_get_num_table_entriesnghttp2_hd_inflate_get_table_entrynghttp2_hd_inflate_get_max_dynamic_table_sizenghttp2_versionnghttp2_option_newcallocnghttp2_option_delnghttp2_option_set_no_auto_window_updatenghttp2_option_set_peer_max_concurrent_streamsnghttp2_option_set_no_recv_client_magicnghttp2_option_set_no_http_messagingnghttp2_option_set_max_reserved_remote_streamsnghttp2_option_set_user_recv_extension_typenghttp2_option_set_builtin_recv_extension_typenghttp2_option_set_no_auto_ping_acknghttp2_option_set_max_send_header_block_lengthnghttp2_option_set_max_deflate_dynamic_table_sizenghttp2_option_set_no_closed_streamsnghttp2_option_set_max_outbound_acknghttp2_option_set_max_settingsnghttp2_option_set_server_fallback_rfc7540_prioritiesnghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validationnghttp2_option_set_stream_reset_rate_limitnghttp2_option_set_max_continuationsnghttp2_session_callbacks_newnghttp2_session_callbacks_delnghttp2_session_callbacks_set_send_callbacknghttp2_session_callbacks_set_send_callback2nghttp2_session_callbacks_set_recv_callbacknghttp2_session_callbacks_set_recv_callback2nghttp2_session_callbacks_set_on_frame_recv_callbacknghttp2_session_callbacks_set_on_invalid_frame_recv_callbacknghttp2_session_callbacks_set_on_data_chunk_recv_callbacknghttp2_session_callbacks_set_before_frame_send_callbacknghttp2_session_callbacks_set_on_frame_send_callbacknghttp2_session_callbacks_set_on_frame_not_send_callbacknghttp2_session_callbacks_set_on_stream_close_callbacknghttp2_session_callbacks_set_on_begin_headers_callbacknghttp2_session_callbacks_set_on_header_callbacknghttp2_session_callbacks_set_on_header_callback2nghttp2_session_callbacks_set_on_invalid_header_callbacknghttp2_session_callbacks_set_on_invalid_header_callback2nghttp2_session_callbacks_set_select_padding_callbacknghttp2_session_callbacks_set_select_padding_callback2nghttp2_session_callbacks_set_data_source_read_length_callbacknghttp2_session_callbacks_set_data_source_read_length_callback2nghttp2_session_callbacks_set_on_begin_frame_callbacknghttp2_session_callbacks_set_send_data_callbacknghttp2_session_callbacks_set_pack_extension_callbacknghttp2_session_callbacks_set_pack_extension_callback2nghttp2_session_callbacks_set_unpack_extension_callbacknghttp2_session_callbacks_set_on_extension_chunk_recv_callbacknghttp2_session_callbacks_set_error_callbacknghttp2_session_callbacks_set_error_callback2reallocnghttp2_rcbuf_get_bufnghttp2_rcbuf_is_staticnghttp2_extpri_parse_priorityclock_gettimenghttp2_set_debug_vprintf_callbackmemchrlibc.so.6_edata__bss_start_endlibnghttp2.so.14GLIBC_2.14GLIBC_2.17GLIBC_2.2.5uui H"XP"Wp" "" """ 0"8" p""$""$")"/0")8"/p")"1")"1"="E0"=8"Ep"="J"="J"P"X0"P8"Xp"P"\"P"\"P"`0"P8"`p"P"d"P"d"P"h0"P8"hp"P"l"P"l"P"p0"P8"pp"t""t"""0"8"p""""""0"8"p""""""0"8"p"(""("""0"8"p" "" """0"8"p""""" "0" 8"p""""","0",8"p";"";""L"0"L8"p"Z""Z""7"0"78"p"g""g""l"0"l8"p"q""q""x"0"x8"p""""""0"8"p""""""0"8"p""""""0"8"p""""""0"8"p"""""C"0"C8"p""""""0"8"p""""""0"8"p""""""0"8"p"'""'""="0"=8"p"3""3"">"0">8"p"X""X""j"0"j8"p"u""u""z"0"z8"p"~""~"""",""P"@"0 " "" """"" "U("0"m8"@"H"P"X"`"Hh"p"x""S""N""7""-" " "" "=" " "f"L"")"" "("0"8"@"H"oP"X"G`"h"p"Tx""6"."""z""HH |"HtH52|"%4|"@%2|"h%*|"h%"|"h%|"h%|"h% |"h%|"h%{"hp%{"h`%{"h P%{"h @%{"h 0%{"h %{"h %{"h%{"h%{"h%{"h%{"h%{"h%{"h%{"h%{"h%z{"hp%r{"h`%j{"hP%b{"h@%Z{"h0%R{"h %J{"h%B{"h%:{"h%2{"h %*{"h!%"{"h"%{"h#%{"h$% {"h%%{"h&%z"h'p%z"h(`%z"h)P%z"h*@%z"h+0%z"h, %z"h-%z"h.%z"h/%z"h0%z"h1%z"h2%z"h3H WPH5VH="WH )rPH5CqH=Mq0`Hz"H=z"UH)HHw]H4x"Ht]@Hz"H=z"UH)HHHH?HHu]Hx"Ht]H@=Qz"u'H=w"UHt H=u"h](z"@f.H=@W"t&Hw"HtUH=*W"H]WKf.AUATIUHSHHu3UfI$HJ *HHHHI$HH(t'HI$H]HH4HMH5MH= MvfD1HDHGÐf.AWIAVIAUE1ATIU1SHHt)DI$LHH=>ofDUHHSHH1SHH%[]SHHC u HC(HC0[USHHH;_u;HCH+C HvLHCHHxH{H{ Hu2HC H[]H BH5=H==H BH5=H=>HUSHHH;_u:HCH+C HvKHCHHxH{/uH{ HC H[]H `AH5;=H=D=hH AAH5=H==IfSHHTC[Df.AUIATE1UHSHHHt.DuHIHuH{HM9uHKDm[]A\HA]@ATUSHH;_uHHSH+S HH;r.HCHxH{Lc HUHuLYI1Lc []A\H $@H5<H=(<Lff.HwHWUHSHHH,H}.CH[]@AUHIATIHUHHSHHHI$uH1H[]A\A]@H4LXHIEt:1I<$u "@IEHH5u:H=~:1fSHH%HCHC C([f.USHHH;_u?HCH+C HvPHCHHxH{H{ HuHC H[]H =H59H=9XH l=H59H=v:\@HHGATIUSHH;_u]HCHHxH{ID$ tBHHHHI^sID$ HSH3HxI|$ I9.ID$ wI+D$IUH H9u1[]A\A]A^@H J8H555H=6.bfAWAVAUATUSHHLwH $u%IFI1H[]A\A]A^A_DHIH9tHH)HIE11f.HL)HLIHtHL)H9Nd IHL9uH^HH<$HJ4"HT$:HIt~HT$IFI.L4L9t>LIoHtM4$Il$LLHIIL9LpuH1[]A\A]A^A_@H[]A\A]A^A_ø{f.ATIUSHnHHMHCH+C HQH9r;HCHxH{LH{ uHC HULHu+ u$[]A\H +6H5F3H=4sH 6H5'3H=H3T@ATHUHSvHH_HIT%HuHCHC[]A\fIHLcHk[]A\H T5H52H=2ff.ATU1SHHt$IHH_HtHLHH[H]A\ÐAUATIUHS1HHWH;VtH[]A\A]LoL;nuH?Ht>H6Ht6uH}HtLIt$HtBL1fHtH 44H51H=1@Mu eH 4H51H=1f.HHHbfHNHHwH?mf.H (Df.AVHIAUIATUSIL$HHE1IN &@P u LPODu HPMDH(L9uK4 HHHIEIE1;HHUHSHUtjHCHEHCHEIH(H(M9C E C uHS1HuNLeHEAHuH}HCMdC uHS1Hu0LeHEAHCMdH3L%HCHsL HCfD1[]A\A]A^DH1[]A\A]A^ø{Ht.H11f? wHc Hw!HHH9uݸOy1fDO@vf.AVHAUATUHStoHLjHCH+C L9IHs AH~HCHPHSHH{7H{wEtI,$AL$ []A\A]A^HCL1Dh H{ Lk H 0H5x.H=W0DHHGHGHGHG HSHtHH3 H[ATU1SLHHOL)H9r[]A\ÐHHH9HCHIL HHt;HCLH;L)HCHHCL)HCHHC LH{L)HC []A\ý{듐f.HHGHGHGHG D@ATI0UHHSH& HHEtMHHEHLHxH@H@H@H@ H@(u[]A\f{fHuH {f.SHHHGHHt HG1H[HG(H9G t=HWHwH|$$uHKHT$HC(HHSHK8HJHJ H[ø fHHG HGHGHHwHw HwHwH7tHHwDf.AWAVAUATIUSHHtrH9IrjL9ILŸ rGHH|$LMou0H|$L{Hk8H;H{HoHo LkHC(Ls Lc0H[]A\A]A^A_@ MIHbfIE1HRfAUIATUSHHtDHHu 2@LImHsL#H HCHH MuIEH[]A\A]Df.U HSHH(H9w8wFHWH|$ku4H߉D$ [HT$D$ HK8HHSHJHJ HkHC(H([]ff.AUIATIUH0SHHH=HtiMHHhHh(Hh HhHhu@HHC1LkHC8LcHC(HC HC0H[]A\A]@LHh뷸{AVIAUIATIUSHHH,RHHHHHHD$IE1H\$HD$MZMLHML@L@(L@ L@L@tML@I0IHL9HuHD$Mt$ID$8ID$Ml$(Ml$ I$ID$1Ml$0H[]A\A]A^@H11[]A\A]A^k{@HtH7HtHf.@f.HWHt(HBH9B uHHH9H t HHHuHWÐf.H1HtfDHJ H+JHHHufAVIAUIATUSHHtTImH} HEH)H9HFHIuLDt[]A\A]A^LHL)rMHHE u[]A\A]1A^Ðf.SHHHGHP H9PtHJHH @21H[t$ t$ uHCHP DSHHHGHP H9Pt@21H[t$ t$ uHCHP f.SHHHWHB H9BtHHHJ @01H[t$ 't$ uHSHB DSHHHWHB H9Bt@01H[t$ t$ uHCH@ f.AUATUHSHHH}I1fHP H+PHHHuHuH[]A\A]DH}H HIt>HmHtHuHU HH)HmHuM,$HH[]A\A]1H{f.USHHHtOHH1f.HJ H+JHHHuDHsHS HH)HHuHH[]1Df.AUATUHSHLG0H?HHu8HGLHG(HHHGHG Hu!>fDHHHH(HHHHHH tHHuH}H[]A\A]HHHu =LLeHsL+LHCHLMuLE0H}LE(H}H[]A\A]1널f.f.HGHHtHPH9P D1f.HGHHVHH9tH)¸H9ÐHFXH9GXÐUHSHHHt!xHE`ƃHthu_HHŋHH}HHH1HHE@HCHHEPHPHUPHCXtH[]DH1[]Df.HHt tHH@f.USHHHo`tfHu_HE`HtSHHH}Ht?ƃHCHHǃHC@HǃHtH[]H f(H5&H=&@f.AWEAVEAUAATAH5USHHHHT$P HD$HD@DDDHD$@ƃHǃǃǃHǃƃHC`HChHCpHCxHǃHǃǃǃHC0HC8fƃHC@HCHǃHCPHCXHǃƃƃH[]A\A]A^A_Df.H@ATUSHHo`Hu uHHLeHLHHދLHH1HHE@HCHHEPHPHUPHCXsHHHE`Hu[]A\H P&H5$H=$HAUATUSHHDA9t!Ho`HtD)uH[]A\A]LmHLHD1DHHHI)1LHH1HHHCHI1IHDHI)HE@LCHHL)H9wHCHHHL[]A\A]SOЉUSHH uJHu_1Ht H[]@H`HtHǃH[]H $H5#H=#H $H5"H= #@SHHLJƒt [fHtH[f.SHHt0@ @t[DHtH[H #H5?"H=t"Ht-@"@t 1fDHG`HHH #PH5!H="fHt1 f1f.Ht1f.HcHcHcHƸH)ֺHH9w 1ff.HcHcHcHƸH)ֺHH9w 1ff.LJ@f.HtH9u @H9tH`Hu1fAUATIUHSHH_hHۉt]LoHk`t+HLƃHHu3f.H[xHuH_u#ID$hHEhIl$h1Le`H[]A\A]@HL}tHGhHtH~puHFxHppHwhH~`Pf.AVAUATUHSH_hAAH|LgfDH[xHtgOÀtLu`HLƃHLt[]A\A]A^fHE`HDHEpHHUhHHM`HPxHBpHfDHH`H@xHuHMxHu HHBxHuHJxHQpDžHE`1HEhHEpHEx[]A\A]A^HHEpHYHE`HUhHHt`HPhHB`HHM`fDHH`H@xHuHMxHu iDHHBxHuKHUxHHPxBHBp9HUxHtHBpHPhHB`H@hH eH5wH=+H TH5XH= ff.AUATIUHSHH_hHۉIt$hH}`toHVhHuHHBxHuHZxHSpMl$Hk`t#HLHƃHH6ufH[xHuHu H[]A\A]HHL[]A\A]H^hHs`@f.UHSHHHGhHtGH~puJHFxHppHuhH{`HPu H1[]HHH[]HuhH{`fSHG`HHtnHWpHtJHOxHHJxtHQp)tH HCpHCxHC`[fHWxHHPhtHB`HBpH H5BH=fDH`tfHhuHpu1HxHHHxHtRHHt uHH`HuHH@HHHq`H@HHHA@uHHf1HHfDtDtut@uσu1HG`Ðf.HGxÐf.HGpÐf.HGhÐf.fffHtHHVHGHWHf1f.HtHHVHGHWHf1f.HLJHLJƇHG`HGhHGpHGxHLJHtcG <wcHHcH{C{fD`t:< tF<t*< t6H H5:H=$HzKf.HGHHGHGHtHHwHGfDHwH7HGHHtHHHHǀtHoHGfDHGHHVHH9tH)1HHFXH9GXÐUSHHHH9sBL MtCHH0 HH9HFHHAHH; Hz|H9HNH[]fDL MufUSHHHt"HHwHcHHH[]RfH[]fUHSHHH?H3H!H{HCHH[]ATUH SH<wHLHcHw ƒJ< < u l ELfAL@@ @1Ht Ht 1HfGtHH@ HǃHǃ LhHǃ(Hǃ0ǃH` HLL11HǃHǃHǃ[]A\LHAL@HA$?@1HfO@HfDLHLLsLcHL5H8HHǃ8HǃHǃ HL5Lxl LHL@LL)LHLf.AWMAVIAUIATIUSLH(M HHI{HGHE11AH HCH HCH HCH HC H( I>1HD$$H H H\$"I!ƀu ǀ ǀ ǀ ǀ ǀ Iƀp ǀ ǀ ǀh Iƀr IH` kIMǀ$ ǀ( ǀ0 ǀ4 @ǀ8 ǀ@ ǀD ǀH ǀL ǀP ǀT @ǀX ǀ` Hǀ ǀ, dHǀ Hǀ Hǀ Hǀ EW8AtAWHtd At AW<, At AO@H AtE_LEtd AtEOPEtd A A€t AWDl A@tEGTEtd At IWH AtIOAtAXtd At IW H AtIW(HtH A tAw\td A@tAW`td @AAt IW0H HHHAt!I6HDH([]A\A]A^A_@IHH8&AJI>H '?IA  @H H @HHHHDHǐAI>HYIHHILH( HIL0 I> 3"I>t3Kd rLJHLJf1@I>HDH5YHHHHUHuH(1[]A\A]A^A_fDIƀt VfIH8IHdDIWI7H` HL$pEW8IHL$AfIwdHw Hw IGlHBIGtHBIG|HBEW8IA€fD[HkH5LJLJHǐI>LJf.ATL UHSHHt(uH9tLHiHLHHL[]1A\@ATUSHDDwYHHHHH1҅u HHPHEHSHxHH肸uƃ[]A\fHHSHH \H5H=TH =H5H=5H H5H=fDAWAVAUATUSHHt$ HL$HLD$PLL$Xt:)D$`)L$p)$)$)$)$)$)$IH H$ Ll$11LD$HD$ HD$0LD$0L HD$(踱LLcLHHH$ LLLHD$HD$ HD$0D$0HD$([L Mt_L0 HHcHt$ AщHL%zH[]A\A]A^A_DH 1fDH0 HHcH fDHL1f{fATHIUSHu ,HHLHSHLHu[]A\@f.SHt3uh$w;HHH艶ƃ[H 9H5H=[葰H H5H=rH H5H=SUHHSHHt u H[]HHH[]Df.USHH8tuH1[]HT$ T$ HHH[]fUHSHHHutH[]HHH[]Wt Df.ATU1St It[]A\1A;$ [@ʼn]A\ff.UHStt1; []fDH[]ATUHSDHH>EtgD?t[UuDt;u2D;e~,HuoHuFHEHt7HH]@[]1A\fEt郻ufDH]H ;H5bH=% H H5CH= ԭ@1|@AUATIUSHHHH@H@HGaHAĮuH++I$1HE1HHkHD[]A\A]t 1f.H臸H1Htu HEH@[f.SHMI1HH|$fuHT$ǂ HH[f.E11ffDE1XSHMIȹHH|$uHT$ǂ HH[E11vfDE1hAUATUHSHHL HX Hu DHHL2HuLH1@I|H(袰H@uH} H5YHHHHLWHLHH0L9HLH"HH8HHHL[]A\A]fH[]A\A]DAWH IAVAA@AUAATIUDSHHt$(LL$HD$ 5Ad @HEEHEHHHHHHHǃHǃHI _E1fAr -A@ A4$E1(DDDEDAD$HD$H5IP HlHHI IP u/A$"Mw A|$HL4HHH[]A\A]A^A_DHE1fAr fAr At A@ DE1Ar DDfT$(t$(LhI L$(Tt$(L8@HcfDMH  H5 H= @HHH[]A\A]A^A_fHD$ E0 AED$t$(HHD$HD$HD$AP $TfAr t$(HLvHH|$ Hif15fHH ) H5 H=*aLd$0DT$,LΧDT$,X@H#I fDI tI HPI HCX DLDT$,CHIDT$,HDT$,DT$,Ld$0DT$,L&DT$,@IP @IH @H|$ HHAfIH @A4$LDDT$,oLt$0DT$,L蕦A4$E1L1ALHIDT$,E+1vH H5* H=(軥H d H5 H=/蜥ff.AUATIUHSHHt utr tu9EHdt w#HcHV` HH9u1H[]A\A]A^A_fDV\ DVX DVT DVH DVD DVP DVL rfL8DLޗ\ATUHSHLfvu;I|$uNHP HtH0 HHЅuQ[]1A\I|$u#Ht߃tI|$tHH HtH0 HHЅt[]zA\@HH 1HtHH0 уH%zAVAUIATUHSvHIt\tSd u AE HH 1HtH0 LHЃӁz贕Au AE u1ۉ[]A\A]A^fL3A$<tcDDht[]A\A]A^fHx[A$H+lj"tqDLHA덾LJ@f.S1u Ht [HH+ H; u1u [f.ATUSu HuHt[]A\@[]1A\ÐHuHuH(蓙tBLH1I<,}t,H(H@uH0t, H9 댃 z@f.Su Ht[@S1uH#[f1t u x u tÐHHf.HSHt'ru[ED[Ð[fATIUSHucHtyt,Ldt tQE[]A\t-1҃[R]A\[]A\1뺺H H5H=.@f.AUATL UHSHHHP t^u>HRt.HHHH[]A\A]fHǃDHHL[]A\A]xyup@zVHHItMtLHfAWIAVAAUL ATAUSHHAtH H9 LHHHALHUHHJu&1EtH H[]A\A]A^A_HD$ THLiD$ H[]A\A]A^A_fDxf{fAWL AVAUAATMUHSHHT$DL$ t¸ MIT$ H@LLHILHHُLHHH T$MLHA9ANYD$ HH߈E`u*u 1H[]A\A]A^A_f.E1LHD$9HLD$H[]A\A]A^A_{LL{Df.AUAATAUHSHHHLJt;H賍IAHDDHYuu H[]A\A]E1ːf.u  t 1fD1ɉmf.u t1@1Ifu  t 1fDHщff.ATIUSHP HHt H0 ЅuKv1u  t[]A\DHI@HL[]A\zfSzljэEӉ[AUH ATUHSHHDfEt t Du4_wH hHHH[]A\A]fL H H D H9su u9u*h H9HME11AHHHAٌA H Ht&H0 HH=zDEHD[]A\A]fDHt H DHzHtEtH|$H{prtNH\$Ht$HڣHt$HͣH({[]A\A]A^A_Aƅr 1XIX 9H H5.H=pH H5H=pHt$H|$Q{{f.AWH IAVAUIATUSH8FT$D$F H~HX HHSHsHI HIX 5IH Ht!I0 LLЅf.D$H8[]A\A]A^A_D cIt~HD$ L%1HD$IHD$DIGH; wCIcLCA@ t91A@ fHI9owA@ :D$LT11ҾL  p\$1ɺLLD$C At uA< tA< KCA8 9fCA4 CD$(HT$H5=A0 LLl$ D$,wA+oECA0 sH|$oAtCA$ CA, qCAt uA( FH LL(D$LJ, Ƈ fD$zSH D$92nl$&1ɉLLD$At ADž@ Ar Ad Aƅs H (H AH H H uLL%D$|umDt$h1ɺLLD$M1Dt$?H 8H H f.AVIIAUL ATIUSHH`t  LIIHHRHI9nH; wxHt$HMLLJu\t t{Hl$ E11ɺLH|H$HHHD$8HD$HD$0H4$L谝tQ@H`[]A\A]A^f 0HL$H$1HkH4$L_uLd$LkE1ɀt ALHMD1XHtmt u2HǾ=ǃ  H`[]A\A]A^DH ǃ ǃ f {ff.AWAVIAUATUSHHLL;^ICIHHMMHD$H HI0 s A A$L\$E4 E$H<$LIc$Ic L\$H9HOIc4 H9HOH9HOH ISI+S H9HH9)AED$<t kHD$sHMMLD$I`HIXH9 IPx)@ADžDHL$IL)H9HGH)IHItxI HtTLM0 Ht$HH)L=lt.zDADžwD1DIfHHDŽ$I0 LHT$HHt$(A =t!H$1IbDu.IH HI0 Ht$HLЅz1H)H$H99H)@II ADž wDAуTHLljCAIu AуHLLljiC^IIH|$H)UH9` H)HH)H92HHDHH)H~/ALgBAB)AH~XAd  IX Ht>LAAH)M0 IL=BIHAƅwnADžHu;I 1HtI0 Ht$HLЃՁz#B |AHuI@ADž1)iI`AH xH%a@Aƒ A HAu D$MA DhA`IcXHHAHHAHRHH9I I9 xHxf.HAƅnI@ADž1hI`Aƒ-A HAu D$MA H LAHAƅI@ADž1egI`7AA 1 LAH =I 1Au A ?Ap ADž.Au D$A H ML AIPH\$HH)H_HL蓼É*?fH\$HIPHZHL茺@lj>AYIHEADž HH\$HIPHzXHL诸IuAL諵ljb>WALfADžH\$HIPHTHL裾I5 A' IPH9HBAu D$A >H LJA"ffAr A@ H\$HIPH?SHL蔼WIP/I;C IH6ADžDAALI܉D$\{HD$`A<H|$`DŽ$t<*I8MHD$PHD$@DL$8HT$0MHt$(H|$@LDŽ$6\Hʼnj<HII)Hl$P|$\$|twH|$`toAd I HaD$M0 LH$H$Ht$H=T=Iy$fMD;AtH$IIH)ȁIHHEfD$HL$(LHT$HHt$`aqN=,_Ld$pLL)IxHL$xH|$HH)HYIH HI0 Ht$HLЃӁzu:eILHIk3IIH)IfDHLlj: AAd I@IPIx+HHH)H\$HHVIh11`HL詢a@ILHI2IHIH)I IxH\$HIPH)HHSIh11w`HLܳILHI2IIH)IfDI 1ADžHtI0 Ht$hLЃӁz8 DfAu7HD$`Ht-t$ L@lj78 L6A8AEhH|$@17WHD$PI)IAiALƔlj7I HH$I0 LH$LILAHJHRHt$$4$Ht$Hs‰Aw !I ADžHLwk+Ad t*HLlj6AAL跓lj6ADž+At 1A$II8H;HDD@DA%IHt+>HF1HHxHH9uH ?H5H=54H5M1FALCDŽ$HD$`LHI LڄA$  H ǚaA3,5!AIoH~ Au MA H =L舥AH HDqGHHI;!I@ADžHD$81[HD$8I`I@[I` AIDžAADž HD;GHHQIHDDGH\$HHmKIDž8IDž1IDžHLI H`D$M0 LH$H$Ht$H= = H$H$LEAHrLHHt$HRT$H@HCH$1~lj36Zf.ADžuIPH|$(ZJ$NRH੿?IM8Ht21A;0LI@ufDHH;pHH9uHAIH$Iȃ$R IHL#lj2AA/HD$`$$$$H\$HIPHJHL̩lj1A}1AII8HHIH$H IADžAL蠂HHAd uTA<< AHt$HHcA IH 1HtI0 Ht$HLЃՁzf0u At1O01At t&Ad uAu0<8 AtH1b<K /uI@1WI`ADžTDLO< < < LAl >At IAƅIHI@ADžhVI`:IHADžI@'VI 1HtI0 Ht$HLЃӁz.4fADž 1.HADžI; HBIH|$xH4_HI8II@1HD@YUI`+É.1@Au D$A cH $LoAGAu D$A *H aL6AH|$xH^HIIhHHTI HH$I0 LH$LILAHJHRHt$$4$Ht$HtADž KHy1IcHwP@HIPIH9HQAu D$A H gLAfDzHDHpHQIH9[HI%I@ADž9SI`XH|$xHpN]HIXIIhHSLMLd$pIHD$PI)LL)AH 9Al :At IAƅIHfAr H I@ADžKRI`Al At IIAA~HAƅADž6@I@QI`ADž 1H$H$LEAHrLHHt$HRT$H@HH$1ulj*_HD$`HT$HLmA)AE(1H$H9HjNH4HHIH9HIxH9I@ADžPI`ALzHHt$HH[A|AHT$HL萇A(GAAxHs[hH6\@At tH *H5H='2'H 'L?zC2A(H uLĘI@AO1D$I$ID;PPH ]H5ԊH=.e&DGAHzH{jAu D$A H LAH H5AH=͌%H &Ht$HH[EH[H L胗A[L0H}AH aHLAAu A ]H nLBH #H5jH=]$H ԄH5KH=Ǝ$AH|$xHwWHIIIhH0/M>HL{t%LH H5H=]C$#f.ATUHSH@IH@ 1L0 @LHHHH~JH@HLH_#HxRH9tH H5H=Z#fDHH?t-Ht$HzEH@[]A\@HtOHtJHzDH@[]A\f.8 H3fzf1ff.d tS,lj#$E[Ðf.t\USHHd t*H}uHt(HHHlj#t H[]@H1[] f.~*9 w"t u@t 1@@t ff. f fu HG K-f.HG Ðf.t ATUSHHr t\th92Hta,HItTHEHH$ED$OHHL{lj"tH[]A\H1[]A\D fATUHSHr t|tf92It_rtVH\,HuGI$HH$AD$D$^OE1H1҉HAuHH[]%{A\fH []A\fH1[]A\DH8d @H!@H0 USHH(t HHD$tn1r t H([]@t\L$ +HHtK|$L$ vD$t H|$aHHoH([]fD떐 fUSHt tI1ۀr tH[]Dt4H*Ht%HaH[]D뻐 fAWMAVAUMATIUSH HHHɉt$T$H$qHLt$0LHD$0AD$8}MH|$(HLLBHD$(HHD${QHI/H^HtH}tHEIG`HEIGhHEIGpt$H$IGx!|$tELL$T$@MLL,$T/LLzAuZ1HH[]A\A]A^A_ÐA$ xdELL$1@MA$ LL,$.LLRzAĉEtHL=/LHPHHD[]A\A]A^A_AH|$H@Lt$0LfDA{~Zt tAHMIt-1Ix@L$HD$I1ɉH@אf. f.AWAVAUATIUSHt HHIILMt HtR1HtkH}@ƉL|$H,$ HMEMH@LDH[]A\A]A^A_DA$@ tA9$ u fff~4HIIHD$H$1ɾHfD fAUATIUSHH(AAHt"HLL$LD$LD$LL$t11HD$PAH$HىLHD$xf f.AWL AVAUATIUSH(t [HD$`LItH@9AM%LLL$HL$GHHD$HL$LL$H|$HHLL$~LL$H|$`LhLLGHHHTHE@LL$`HT$HMDHEHE`X(HL q1tLHj(HLOGH([]A\A]A^A_fDMu;LLL$GHtIHD$LL$9fHT$`LL8 뤐H|$?{닸{널AWH AVAUIATUSH(t HD$EHH*H11fHDHH9uH hHT$H@L|H|$LHHD$BFHIHT$H<IE1H@I>HCIIHIFHSHs I9HxuL)H9|$H|$EHH}HRHC@HLHC`HC&HLJo1tL|$HL"'HLEH([]A\A]A^A_fDE1v ܸL{Ƹ{H H5HH=gxeDAWAVAUATUHSHt @ 1AI@MH=@ML E1LDHHHQHC@LLDHC`HCC&HHn1tLHU&HLZDH[]A\A]A^A_fIpLHL$DHIt.HL$LHH K@ 멐롸{LJ{AUIATIUHLSHH8H|$LL$PLL$LLHHIH8[]A\A]@AUIATIUHLSHH8H|$LL$hPLL$LLHHIH8[]A\A]@AUIATIULSHH(HOLLHIH([]A\A]fAUIATIULSHH(HOLLHIH([]A\A]fAW AAVAAAUL ATIUSHtuLHuBHHtmHOHE1DHHC`HEHChHECyDsxHCp"HLk1tH"HL"BH[]A\A]A^A_Ð{fATUSH Ht.HAHHN@DHHH []A\H nH5ɂH=܂fDATUSH Ht.HAHHN@DHHH []A\H H5iH=|fDAUIHATIHUHSHH3tCH[HL9wHHH[]A\LA]&HH[]A\A]fDH Df.[f.AWAVAUIATL USH@ L$ H AMtxL[@HHHML$ @AMH HLi1tH HL@H[]A\A]A^A_fH z ɐ{fff7Ή7Ðf.fÐf.HH 7HtHGH9uÐf.~RDE1EDIA)xD1fDEDE9lE)D:9O)lj:xE)1fDADx@AA)D9|29)D)1D‰f.f.x0DAA)E9AD:9O)lj:)1ÐH 3PH5rH=| f.1~19~jn@Hـt+HtHʀfD\{xHGtyH tzHӄM HusHZ H]D@~FHɂH1H͂DH[HvHHȂuV@H~HH~mH~Zf.HH;-H H~uHÂH@Hq H}H}F@H~}HHMH}HH#wHHQHF~H!HHH|H}1HtA?:tDHH9t/H"u9ftHH9ufDHtHH@f.HH9t+HuDtHH9u@Ht+< t< tD7< t< t fD1Df.1Ht;HH9t+H7< u#<tHH9u1f.HH9t*H<u&fD<tHH9u1f.HH9t*H<u&fD<tHH9u1f.HSHHt HHH[@ HHcHDH{H{H{H{H{H{H{H{H{H{H{H{H{H{H{AWAVAUATUSDH(A9H|$Ht$w_DIMHD$E1fDAEtA9wGEHT$LO<LxuAVHL$IL!AHL$H([]A\A]A^A_H([]A\A]A^A_@AULwAAATIUHSHH(At*LKA DLHHE1AAHD[]A\A]fDAULAAATIUHSHHAt*LۊA DLHHE1AAHD[]A\A]fDAAAPHc҉!H9w>H) HGHvDHHʀHPw@0HH) Ƹ@7DAVHAATUSHD$(I9$MA݃IADEAD9DA9vHIIL9A݃I|EDAD9wnDD9r`Ax[]IBLDA\L)A^HL$0AAADA" A8Dt'D[]A\A^f[]A\HA^fMQI9DfL)[]A\LDA^1ff.ATUHSHHv?HFHvc fDHHHJHwLbIv+fDAH$ LHH+-H[]A\Af.HH?SHHcHf[fnuHH=3[fyuHH=v8[fGHKHAMHMHHwMxIvIfDAuHHH$LHL,"uH9ukHLL"H[]A\A]A^A_úHH$LHL!uHLL!H[]A\A]A^A_AfH H5(H=. fATH)E1USHHH9rHALc@L!HHxL"uH)[H]A\fHH9wvHwHH#wHH GPH5~H=~bjf.HHGH=H9v1HH;HFHCHFHCHHPH@HC(HFHSHPH@HS HC0FHC@CLC8H{[f.AWAVAUIATUSHH(HHVL$HO Lg(Ht$HjHhH $HO0H JD%H9fIuHLvLLHxH0IHH+GH+FMuLHIE(tCAWLHHt3I9u q@HHP@HtI9uH@IW@HIIG@I?H<$Lo!Me(IM0JD%H9I1H9vH([]A\A]A^A_HH<$P!HHHD$ZHt$DIMIEHQHH9HAML9wJ4H<$ HHD$MeE1Mt"DLLEHL$JIM9uIuH<$ Ht$IEIOHIMIuHIUH!HL$HH IEAE8PAU8AHD$ALtD$HH\$HHtHS@HIm(H(1[]A\A]A^A_I}IuHW됾AH\$H{HH;@H<$H{hf.AUATIUSHH(HLHuH,$D$H}Ll$0D$uSH$I$HD$ID$HD$ID$H1LHǃHǃH([]A\A]fD11HHuH,$Ll$fSHHSH;[Jf.ATIUHSHW G<HG0@HۃuH4HHHEH}@HHEH]HE@HE(E8@@1Hu^uAu,IvcƅPL@HH1[]A\fIw2f1HfGtHtƅPLe0H\E@H}Af71HfO/{m@HUSHHHHs C<HC0f.HuH4HHH{HHHHkHCHCHC(C8HǃHǃHǃǃǃ.H{p%HǃHǃ1ƃHǃHǃHǃƃƃH[]ø{fHw gSHHpHdHHǃHǃBH6Hs H[ fHH@ƇPH9HGHHHw0H9HGHHHw@u1H@f.wG1H;w0HrHHHw0LJ1D$ D$ Hf.SHFHHH=H9vXHAWكv5A-t/A6t)IV0HL$IL$HRH HH9ɉL$D$D$I|$wD$D$jL$IcHD$XoH==!HEl$HL8LEIHDAHA=&IcH=$>!HHD;d HSI;WuIwH;\uMIfIuH~I~I|DHIHPIwHXHw{L|$ D$`LH|$8HLQ=fHL$HH|$ŝHHfH1iH9u$qT$H|$8Ll$LEILl$XWD$uIHL$(HT$Ht$H|$ "_HHƇPHHHG0H9sH|$8oZIv0HH|$8T?EŝJ@AUMATIUHSHHHO Ha t HHH[]A\A]LLHHHE HI tHcIDHH[]A\A]HDf.AUMATIUHSHHHO Hq t HHH[]A\A]LLHHH HI: tHcIDHH[]A\A]HDKf.HRHH t HHHFH(HFH9uf.AUIATIUSHHHtXXH[HHtSHLHuIm1H[]A\A]HH߉D$ 1D$ H[]A\A]fHfD{f1IfUSHHHo H+HHH[]f.AWIAVAUATUHSJHx<HG Ht$0DL$,D$LHD$H2HILd$LIIIwpI@ILJILJ1AHt$ IH|$Ht$L9…A vHKlHc H@AEALJ ILJILJAAAHLLLD$LCHL$LIŅAeIHT$H|$ALJ Hp8HH4IH|$ HPHpf.AEALJILJILJAAAHLLLD$LkHt$LIŅAMIHT$IALJHp^HHZIIHHPHp1(@AUу L@CALJALJAEAAE<A@IwpHLLHIIIII+LAIHt$0HB+HHuVALJALH)Hx[]A\A]A^A_"T$,VAHAG<Hx[]A\A]A^A_DIwHHLLHxIIIG`IG`I+GXIHBALJ 1@AAtAMIIMOHLLLD$LI=HB|$LIŅbIHAHALJ I1MM9AMFHLLLD$L{HDD$LIE1LIIIG0ALJ1bfDAE< XALJALJILJILJ1DIL)ILH9HGHIHIHH)HIIHjD$,HxL[H)]A\A]A^A_fIHI`L)LH9HGHHL$8(HL$8IHIG`H)HHIVIHyH|$IHT$IALJHtHH|$NIHT$H|$ALJ HtHALJALJAEAAE<AI;D1kbfALJALJDHA]HPH|$PLIHt$0HD$PHHD$XHFHD$`HFLALJH)Af.UHSHH(HHx6Et0H$HJHRHSHT$H HJHRHST$HKS H([]f.[f.;f.SHHHHǃHǃ1ǃ[ATIUSHHHt]HHHtXHHuI,$1H[]A\f.HH߉D$ D$ H[]A\@{HfD{f1 fUSHHHo NHH[H]Mf.AHJHf.Kf.f.HGH=HtHGHH=H9s D1f.HG(Ðf.HG0Ðf.HGH=HtHGHH=H9s UD1f.HG(Ðf.HG0f.Ht.H H1HHH9uHH1f.AWAVAUL,ATIUHSHLGIxI+x L91E1A 0fDI@ LHH I H ɉMD$I@ I9tvHEDH)H4‹FHI NjHHvHw@LLH8HuJHIHwMD$IxI+x DIHHv)LLH8HXt@H[]A\A]A^A_Ht3HL)ٸL[]A\A]A^H8A_  1D@fUDH, SH9fDT$D$Ha.fAAIMN EfExPH9thHDZAIDINE fEyHFLHLNEJDE HFH9LPLVEQDEuEfDtfA@tH[]H1f?DHN!1=HLf.fɉ7WG@GG@f.1ut1fDG~=~GfGSHHH%{[f.;f.O8wHO8w<O8wLO8wPO8w@@ vO8 Ddff.@ t2@t@ t@O8OD@O8OD@O8ODff.O8@wTO8Hw@O8Hw@O8wXDO8Hw @O8Hw(@O8 w\DO8@w`DO8H7HWÐO8Hw0@SHHH%{[f.f.H7ff.HwÐf.HwÐf.HwÐf.Hw Ðf.Hw(Ðf.Hw0Ðf.Hw8Ðf.Hw@Ðf.HwHÐf.HwPÐf.HwXÐf.Hw`Ðf.HwhÐf.HwpÐf.HwxÐf.HHHHHHHHHHHH f.f.f.f.HJ!HHGH7HHHGH7HHHHDHHGHHH@f.HHG HHHf.@HtK1HH9t7 DIDA ADG DQDI AAFA8t1f.HtlPЀ wa0HWHH1H IfDHH9t@DAHЀ w$H9H AMȃ0HHHI)L9~H@f.%tvѸu't"ƀtсu u(1~ tfDHG0DuӁtfD uHG01~ uf JfcvBu"f0tfttEHG01fHG01D%HG0@f11Df.F Ѓ@@uHW01Ht1H;W8@f.Hw8@Hw8uHW01Ht1H9fDAUIATUSHF <ts<u_H^Lf MtR1fDHH(L9t;H{uH3~duH=Q"uHCHtTHt&fDH[]A\A]DH^(Lf0fDHsH=ĠuAfHsH=uAf.AWIAVAUATUSHXD7DoH\$Ld$0HHLHHuNH|$uH$H=%Ä́DE,$kHSHzE,$8H}0HCHpHxlHHE0qfZHSHzKE,$HCHx)HpH= HCHxHpH=әdA:l1?f=RPfcf-fcw jH}0HCHpHxZHHE0dEe뉋 OHSHJH> H+Hzfef fufA:fDA:xfHrH=K;A DE,$+ E,$HrH=eKuH}0RHCHxCHpH=&&HE0HpH=ȗ'ADE,$w< f.H=ADE,$/HHCHHPHptO% HH@D(H 4H5H=茿HzHH@D(f.ATIHv(UHSHHHt6HHUH(HMHPHHJHHBHL`@ 1[]A\ø{DAUIATIUHHHuSHuI$HLHxHhH[]A\A]@HHHaG tG HtG t~!G tHGHHHH PH5H=X.@f.HWHG1 fDG fD@w@f.f.H7HwHWHGff.HGH9t7r=HwHwHHGHHH9rHHQL9Hy:tf.1Uf1frN6H@@HHJL9H|z=tqSHHGrWu2HH{H9t )H[fDH H5H=EHHH9t u,HPfDHRJ uH9HHufD)tkHsuSSH[DHt$Ht$/P@HPfHRJ uH9HHu"HHCCSH1Ht/tt$H ݙH5H=9赴D1[ff.UHSHHOȃ}uXHHKH98;HPH9Ht%x uuHHx u^H9HuH[]fH IH5RH=Ht$uɋKHt$Kd@HPuHHSH9t8=t+Ht\EE1EH[]HH9HRHHH[]oK11*SH11Ht-tt"H H5dH=1[ff.ATIUHSGH tvI t unu'H}uHuLH2t^[]A\fu,HHOH9t8 uHH9Hu[]A\DH H5H=xQHHSH9t8=t/HtEEEC 1[]A\HHH9H tMx(u(HtEEHC H1(HHC Df.UHSHHGtvjt#fuFHu:HZu.H(usHtEEHCH1H[]ÐudHHwH9t(HP tfHRJ uH9HHuH[]@HHuCH[]H PH5H=虰fSGHtvbt"@{u>Hu2H HSH9t!9 HAt\@Hx uNH9Hu[uq[item->index] == itemnghttp2_pq_removenghttp2_map.c0 == rv@%u data@%u hash=%08x key=%d base=%zu distance=%zu map_resizenghttp2_map_insertnghttp2_queue.cqueue->frontqueue->backnghttp2_queue_backnghttp2_queue_frontnghttp2_queue_popnghttp2_frame.cbufs->head == bufs->currv == 0payloadlen >= 4a->namelen == 0a->valuelen == 0((size_t)((buf)->end - (buf)->last)) >= 5((size_t)((buf)->end - (buf)->last)) >= 4((size_t)((buf)->end - (buf)->last)) >= 8((size_t)((buf)->end - (buf)->last)) >= 2 + altsvc->origin_len + altsvc->field_value_len((size_t)((buf)->last - (buf)->pos)) == 9 + frame->hd.length((size_t)((buf)->end - (buf)->last)) >= 4 + priority_update->field_value_len((size_t)((buf)->end - (buf)->last)) >= padlen - 1ff`fff``nghttp2_frame_add_padnghttp2_nv_equalnghttp2_frame_unpack_priority_update_payloadnghttp2_frame_pack_priority_updatenghttp2_frame_pack_originnghttp2_frame_pack_altsvcnghttp2_frame_pack_window_updatenghttp2_frame_pack_goawaynghttp2_frame_pack_pingnghttp2_frame_pack_push_promisenghttp2_frame_pack_settingsnghttp2_frame_pack_rst_streamnghttp2_frame_pack_prioritynghttp2_frame_pack_headersnghttp2_stream.cstream->queuedstream->item == ((void *)0)stream->itemstream->dep_prevstream->sib_prev == ((void *)0)(stream->flags & NGHTTP2_STREAM_FLAG_DEFERRED_ALL) == 0nghttp2_stream_dep_remove_subtreeunlink_depnghttp2_stream_dep_removeinsert_link_depnghttp2_stream_resume_deferred_itemnghttp2_stream_defer_itemstream_obq_removenghttp2_stream_attach_itemnghttp2_stream_reschedulenghttp2_outbound_item.c@HPX`hp08nghttp2_outbound_item_free0@PL  4 8(XH +-P-8-+++,,4$6\6L65554L54CBDDDAtA@@tDRlR|RRRRRRR\RtSSS$S4SDSTStSdSR]^^,]$\$\[\[ZlZYYLXWtWVWV,_[eff[Bfele%e[f[[[[[dcDc ccbDba~acnd nghttp2_session_upgrade2nghttp2_session_upgradenghttp2_session_get_local_settingsnghttp2_session_get_remote_settingsnghttp2_session_set_stream_user_datasession_sched_reschedule_streamnghttp2_session_pack_datanghttp2_session_add_settingsnghttp2_session_recvsession_process_settings_framesession_end_stream_headers_receivedsession_after_header_block_receivednghttp2_session_mem_recv2nghttp2_session_on_priority_update_receivednghttp2_session_on_priority_receivednghttp2_session_on_push_response_headers_receivednghttp2_session_on_response_headers_receivedfind_stream_on_goaway_funcsession_close_stream_on_goawaysession_after_frame_sent1session_pack_extensionsession_predicate_push_promise_sendsession_predicate_headers_sendsession_predicate_response_headers_sendnghttp2_session_predicate_data_sendsession_prep_framenghttp2_session_mem_send_internalnghttp2_session_mem_send2nghttp2_session_adjust_idle_streamnghttp2_session_adjust_closed_streamsession_ob_data_removenghttp2_session_open_streamnghttp2_session_add_rst_streamsession_ob_data_pushnghttp2_session_reprioritize_streamPRI * HTTP/2.0 SM nghttp2_session.cstream->queued == 0urgency < (7 + 1)stream->queued == 1dep_streamhead_streamheadHEADERS: stream closedHEADERS: stream_id == 0PUSH_PROMISE: stream_id == 0PUSH_PROMISE: push disabledPUSH_PROMISE: stream in idlePUSH_PROMISE: stream closedPING: stream_id != 0GOAWAY: stream_id != 0WINDOW_UPDATE to idle streamPRIORITY: stream_id == 0depend on itselfRST_STREAM: stream_id == 0RST_STREAM: stream in idlenghttp2_is_fatal(rv)SETTINGS: stream_id != 0SETTINGS: unexpected ACKstream->item == itembuf->pos == buf->lastDATA: stream_id == 0DATA: stream in idleDATA: stream closedDATA: stream not openedDATA: stream in reservedinlen == 0SETTINGS expectedtoo large frame sizeCONTINUATION: unexpectedHEADERS: invalid paddingPUSH_PROMISE: invalid padding!session->serveri < iframe->nivDATA: invalid paddingproclen == readlenstream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIESstream->closed_next == ((void *)0)stream->closed_prev == ((void *)0)stream->state == NGHTTP2_STREAM_IDLE(stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES) || nghttp2_stream_in_dep_tree(stream)!(stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES)(!session->server && session->pending_no_rfc7540_priorities != 1) || (session->server && !session_no_rfc7540_pri_no_fallback(session))pri_spec->stream_id != stream->stream_idheaders_frame->hd.type == NGHTTP2_HEADERSrequest HEADERS: stream_id == 0request HEADERS: client received requestrequest HEADERS: invalid stream_idrequest HEADERS: max concurrent streams exceededrequest HEADERS: depend on itselfstream->state == NGHTTP2_STREAM_OPENING && nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)stream->state == NGHTTP2_STREAM_RESERVEDpush response HEADERS: stream_id == 0HEADERS: no HEADERS allowed from client in reserved statepush response HEADERS: max concurrent streams exceededPUSH_PROMISE: invalid stream_idPUSH_PROMISE: invalid promised_stream_idGOAWAY: invalid last_stream_idWINDOW_UPDATE: window_size_increment == 0WINDOW_UPADATE to reserved streamPRIORITY_UPDATE: stream_id == 0PRIORITY_UPDATE: prioritizing idle push is not allowedPRIORITY_UPDATE: max concurrent streams exceeded!session_no_rfc7540_pri_no_fallback(session)SETTINGS: ACK and payload != 0SETTINGS: invalid SETTINGS_ENBLE_PUSHSETTINGS: server attempted to enable pushSETTINGS: too large SETTINGS_INITIAL_WINDOW_SIZESETTINGS: invalid SETTINGS_MAX_FRAME_SIZESETTINGS: invalid SETTINGS_ENABLE_CONNECT_PROTOCOLSETTINGS: server attempted to disable SETTINGS_ENABLE_CONNECT_PROTOCOLSETTINGS: invalid SETTINGS_NO_RFC7540_PRIORITIESSETTINGS: SETTINGS_NO_RFC7540_PRIORITIES cannot be changed&session->aob.framebufs == bufs((size_t)((buf)->end - (buf)->last)) >= datamaxsession->remote_window_size > 0session->last_sent_stream_id < frame->hd.stream_idsession->obq_flood_counter_ > 0session->last_sent_stream_id + 2 <= frame->push_promise.promised_stream_idsession->callbacks.pack_extension_callback2 || session->callbacks.pack_extension_callbackDATA: stream in half-closed(remote)Remote peer returned unexpected data while we expected SETTINGS frame. Perhaps, peer does not support HTTP/2 properly.DATA: insufficient padding spaceHEADERS: insufficient padding spaceSETTINGS: too many setting entriesPUSH_PROMISE: insufficient padding spacePRIORITY_UPDATE is received from serverIgnoring received invalid HTTP header field: frame type: %u, stream: %d, name: [%.*s], value: [%.*s]Invalid HTTP header field was received: frame type: %u, stream: %d, name: [%.*s], value: [%.*s]iframe->state == NGHTTP2_IB_IGN_ALL((size_t)((&iframe->lbuf)->end - (&iframe->lbuf)->last)) > 0unexpected non-CONTINUATION frame or stream_id is invalidnghttp2_submit.cpri_specdata_prd(size_t)(p - (uint8_t *)ov_copy) == nov * sizeof(nghttp2_origin_entry) + len + novnghttp2_submit_data2nghttp2_submit_datanghttp2_submit_origindetect_self_dependencynghttp2_helper.cdelta >= 0SuccessInvalid argumentOut of buffer spaceUnsupported SPDY versionOperation would blockProtocol errorInvalid frame octetsEOFData transfer deferredNo more Stream ID availableStream is closingStream ID is invalidInvalid stream stateGOAWAY has already been sentInvalid header blockInvalid stateFlow control errorToo many inflight SETTINGSStream was refusedInternal errorCancelOut of memoryUnknown error codeNO_ERRORPROTOCOL_ERRORINTERNAL_ERRORFLOW_CONTROL_ERRORSETTINGS_TIMEOUTSTREAM_CLOSEDFRAME_SIZE_ERRORREFUSED_STREAMCANCELCOMPRESSION_ERRORCONNECT_ERRORENHANCE_YOUR_CALMINADEQUATE_SECURITYHTTP_1_1_REQUIREDunknownStream was already closed or invalidThe transmission is not allowed for this streamAnother DATA frame has already been deferredrequest HEADERS is not allowedThe user callback function failed due to the temporal errorThe length of the frame is invalidHeader compression/decompression errorInsufficient buffer size given to functionCallback was paused by the applicationServer push is disabled by peerDATA or HEADERS frame has already been submitted for the streamThe current session is closingInvalid HTTP header field was receivedViolation in HTTP messaging ruleWhen a local endpoint expects to receive SETTINGS frame, it receives an other type of frameThe user callback function failedReceived bad client magic byte stringFlooding was detected in this HTTP/2 session, and it must be closedSETTINGS frame contained more than the maximum allowed entriesToo many CONTINUATION frames following a HEADER frame0`p nghttp2_increase_local_window_size  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~h2http/1.1vidatetalinfrohosvar:patalloserveaccepexpec:metho:schemupgradrefresrefere:statuexpireif-rangif-matcpriorit:protocokeep-alivset-cookiuser-agen:authoritretry-aftecontent-typmax-forwardlast-modifiecontent-rangif-none-matccache-controaccept-rangecontent-lengtaccept-charseaccept-languagaccept-encodincontent-languagwww-authenticatcontent-encodincontent-locatioproxy-connectioif-modified-sinctransfer-encodinproxy-authenticatif-unmodified-sinccontent-dispositioproxy-authorizatiostrict-transport-securitaccess-control-allow-originghttp2_hd.cenclen == lenidx < ringbuf->lenringbuf->len > 0:authority:methodGETPOST:path//index.html:schemehttphttps:status200204206304400404500accept-charsetaccept-encodinggzip, deflateaccept-languageaccept-rangesacceptaccess-control-allow-originallowcache-controlcontent-dispositioncontent-encodingcontent-languagecontent-lengthcontent-locationcontent-rangecontent-typedateetagexpectexpiresfromhostif-matchif-modified-sinceif-none-matchif-rangeif-unmodified-sincelast-modifiedlinkmax-forwardsproxy-authenticateproxy-authorizationrefererrefreshretry-afterset-cookiestrict-transport-securitytransfer-encodinguser-agentvaryviawww-authenticaterr0vuuuxvPvvtw`u(uut`ttss@srrrrrsrr$xx`r`rw`r`r`rw`rfx`r`r`r`rExx rx r r rx rx r r r r r rhx r r r rGxvcvqq wqqqqqqqqqBvv4ll̔ēܕ|nghttp2_hd_table_get2emit_stringpack_first_bytenghttp2_hd_table_gethd_ringbuf_pop_backhd_ringbuf_get((idx) < (context)->hd_table.len + 61)  #*19@@012aceiost 001122aacceeiioo0 00(01 11(12 22(2a aa(a00 0000)08011 1111)18122 2222)282aa aaaa)a8ac cc(ce ee(ei ii(io oo(occ cccc)c8cee eeee)e8eii iiii)i8ioo oooo)o8osstt %-./3456789s ss(st tt(t  %%--..ss ssss)s8stt tttt)t8t  ( % %%(%- --(-. ..(.     ) 8 %% %%%%)%8%-- ----)-8-.. ....).8.//33445566778899/ //(/3 33(34 44(45 55(5// ////)/8/33 3333)38344 4444)48455 5555)5856 66(67 77(78 88(89 99(966 6666)68677 7777)78788 8888)88899 9999)989!"$%+.25:=AD@=A_bdfghlmnpru&'==AA__bbddffgghh= ==(=A AA(A_ __(_b bb(b== ====)=8=AA AAAA)A8A__ ____)_8_bb bbbb)b8bd dd(df ff(fg gg(gh hh(hdd dddd)d8dff ffff)f8fgg gggg)g8ghh hhhh)h8hllmmnnpprruu:BCDl ll(lm mm(mn nn(np pp(pll llll)l8lmm mmmm)m8mnn nnnn)n8npp pppp)p8pr rr(ru uu(u::BBCCDDrr rrrr)r8ruu uuuu)u8u: ::(:B BB(BC CC(CD DD(D:: ::::):8:BB BBBB)B8BCC CCCC)C8CDD DDDD)D8D,-/03467;<>?BCEH@EFGHIJKLMNOPQRSTEEFFGGHHIIJJKKLLE EE(EF FF(FG GG(GH HH(HEE EEEE)E8EFF FFFF)F8FGG GGGG)G8GHH HHHH)H8HI II(IJ JJ(JK KK(KL LL(LII IIII)I8IJJ JJJJ)J8JKK KKKK)K8KLL LLLL)L8LMMNNOOPPQQRRSSTTM MM(MN NN(NO OO(OP PP(PMM MMMM)M8MNN NNNN)N8NOO OOOO)O8OPP PPPP)P8PQ QQ(QR RR(RS SS(ST TT(TQQ QQQQ)Q8QRR RRRR)R8RSS SSSS)S8STT TTTT)T8TUVWYjkqvwxyzFGIJ@UUVVWWYYjjkkqqvvU UU(UV VV(VW WW(WY YY(YUU UUUU)U8UVV VVVV)V8VWW WWWW)W8WYY YYYY)Y8Yj jj(jk kk(kq qq(qv vv(vjj jjjj)j8jkk kkkk)k8kqq qqqq)q8qvv vvvv)v8vwwxxyyzz&*,;XZKNw ww(wx xx(xy yy(yz zz(zww wwww)w8wxx xxxx)x8xyy yyyy)y8yzz zzzz)z8z&&**,,;;XXZZLMOQ& &&(&* **(*, ,,(,; ;;(;&& &&&&)&8&** ****)*8*,, ,,,,),8,;; ;;;;);8;X XX(XZ ZZ(Z!"()?PRTXX XXXX)X8XZZ ZZZZ)Z8Z!!""(())??'+|SUX! !!(!" ""("( (((() ))()!! !!!!)!8!"" """")"8"(( (((()(8()) ))))))8)? ??(?''++||#>VWYZ?? ????)?8?' ''('+ ++(+'' '''')'8'++ ++++)+8+| ||(|##>>$@[]~[\|| ||||)|8|# ##(#> >>(>## ####)#8#>> >>>>)>8>$$@@[[]]~~^}]^ ($ $$($@ @@(@[ [[([ )8$$ $$$$)$8$@@ @@@@)@8@[[ [[[[)[8[] ]](]~ ~~(~^^}}<`{_]] ]]]])]8]~~ ~~~~)~8~^ ^^(^} }}(}<<``{{`n^^ ^^^^)^8^}} }}}})}8}< <<(<` ``(`{ {{({aeo<< <<<<)<8<`` ````)`8`{{ {{{{){8{bcfipw\dghjkqtx~\\lm\ \\(\ ( (\\ \\\\)\8\ )8 )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8rsuvy{z|} ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8  ( ( ( ( )8 )8 )8 )8 (   )8  (  (     ) 8  )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( )8 )8 )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8  ( )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8     (  (   (  ( )8     ) 8      ) 8  )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( (  )8 )8 )8      (   (  (     ) 8      ) 8  )8  0@P`p 0@P`pP @ T @  `X\`dhlptx|    (08@H  `HpLPTX\`dhlptx|@ @@ @ (@`08@@ @`1.61.0CONNECTHEADnghttp2_http.cnv->name->len > 0OPTIONStrailersedgBdgcgggggggggggggggggggggheggggggggg8eggggggggggggggggggaggggeaaaacvcefffffffffffffffffff5effffffffffffffffffffffffffff_ffffd____nghttp2_http_on_headernghttp2_rcbuf.crcbuf->ref > 0nghttp2_rcbuf_decrefiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiTkjjjjjjjkjj ljj l l l l l l l l l lljjjj\l kkkkkkkkkkkkkkkkkkkkkkkkkkkjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkPkhkPkPkPkPkPkhkhkPkPkhkPkPkPkPkPkPkPkPkPkPkPkPkPkPkhkhkhkhkhkhkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkhkhkhkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkPkhkPkhkPkk h h hkkkkkkkkkkkj h hxj h h hkkkkkkkkkkkkkkkkkkkkkkkkkk h h h h h hkkkkkkkkkkkkkkkkkkkkkkkkkkifffifffiffffffffifffifffifffifffifffifffifffffffffifffifffifffifffifffi>?456789:;<=  !"#$%&'()*+,-./0123sf_base64decodesf_parser_itemsf_parser_listsf_parser_dictparser_skip_paramssf_parser_inner_listparser_numberparser_skip_inner_listsf_parser_paramsfparse.c!parser_eof(sfp)(src->len & 0x3) == 0i > 2*p == '=' && p + 1 == end*p == '=' && *(p + 1) == '=' && p + 2 == end;\ Hx%FH 8(X    8x!!"0H#px###H$$H%8&x''''0'PX((())x))H*p*+8++++(+@,X,pH,X,,,,,-(-0H-HX-`x-x----.8.. .8.P/h(/8/h/X0080XX1h112x2(2X3p8334(4HX5xh55H66(H7Xh7xH8h899HH;;h<0<`====X?8 ?P @ @ @ xA!A !HBP!B!B!B!C"C"C0"Dh"D"(E"(F(#XF@#FX#Fp#HG#G#G$8H8$H`$8I$I$J0%JH%J`%Kx%K%K%L&N`&(Nx&8N&N&O'O('P`'P'HQ'Q'Q'R'HR(R (R8(RP(S(S(8V((WH)W)HX)xX)X)XY)hY*xY(*Y@*YX*Yp*Y*Y*Y*(Z*xZ*H[+h[+[0+[H+\`+x\+\+\+_ ,e,8f,(g,h8-Hih-i-8j-j-j0.kH.Hk.k.hl.xl.l0/mH/8m`/Hmx/m/m/m/m/m0n0(oh0t0v 1xxh1z1hz1z(2{`28}2(~28~3~(3~@3HX383383؁4؂844(4X4(5H55؇55X5(6؉x6Ȋ6(H77Ȍ7778(8x8h89X99980::ؘ:H;;8;؝@<x<<<=H8=ؠ`=h=ȩ`>h>X?`??@@hX@x@X@@A0A(PAXpAxAAAAA8BXBB8BhC0C8CCC80DhPDDD(D8DXDhExE`EEEEEx0FhFF(GXG8pGGG8H8PHhhHHH8IHhII( JpJ Jh J 0K hK8 K KX (L `L8 LH L( M8 0MH HMX `Mh xM MHMMMM(Nh N8NPNHhNNNNxOPOXOO(P@P#Q8%@R%pR%RH&R&R&S'`SX(xS(S)T(*0T*PTH-T.T(.U/HU/`U0U0UH1U1U1U2 VX3PV9V9V9W:XW(:pWh:W:W;W8;X(CXCXCXCXCYxDXYDpYDYDYDYDYDYEZ8E(ZHE@ZXEXZhEpZEZEZEZEZHG8[XGP[8Hx[HH[hH[xH[H[H[H\I(\(I@\8IX\HIp\XI\hI\xI\I\I\J]J](J0]8JH]HJ`]XJx]hJ]xJ]J]J]J]J^J(^J@^KX^Kp^(K^8K^HK^XK^hK^xK_K_K0_KH_K`_Kx_K_K_K_L_L_(L`8L `HL8`XLP`hLh`xL`L`L`L`L`L`LaL(aL@aMXaMpa8MaXMaMaHNaNaObObO0b(PHbQbQbZ`cH[c[c[c[c\d(\(d8\@dH\Xdh\pdx\d\d]d(]dx]d]e] e8^8e^Xe8`edeHefe ffhf8gfhfigjHgk`gkgzRx $PFJ w?;*3$"4D wBBD D(D0`(A ABBD|h BBE B(D0A8D@z8A0A(B BBB  AW, }BDA q ABE ,D 7L\HAAG [ AAJ H AAF D AAJ D AAE  \BEE E(D0C8D@t 8A0A(B BBBF X8A0A(B BBBL<]BED D(F0k (F ABBE D(C ABBDBEP K(e  ABGG N ABB<PBEJ F(A0u (A BBBA ",4DLBED D(F0p(A ABB4|ZBBA D(D0F(A ABB40BBA D(D@(A ABB<BDD b ABA P ABE $,DEC,T7BA~ GH B(AK D W$NT4WADL l AAA K ACA ,PxD,T\-Ut0 $(_Dc I Y G G4`GADG l AAF DAA$x6ADG cAA,BDA G0 CAB$D DADJ rAAlHPQ$&,D.\t9-4Ld|+"(I`"x)" $ $< ,ADG ]AALd BEA A(D0 (D ABIJ M (A ABBE $ @8AGG XFA X/Ac D , hAAD A AAA ,  ,D AAD @ AAA t AO4 \BED D(G0w(F ABE, HtBAA M ABA   $ ,ADJ ZAAL< BHN G(D0Z (A ABBE J (C ABBA < BAD m AEF K ABA  h&Ad, xAAD E AAA  ,4 BDA S NDA 4d 0EBED D(J0e(A ABB, HdBHD K ABA , AAD @ AAA  AT, BDA k ABA L Dd RBB G(D0D@e 0A(A BBBA < BBE A(A0 (A BBBE | fBBB B(A0A8DPb 8A0A(B BBBF  8C0A(B BBBE D 8F0A(B BBBA ,lxBDA S ABA 4tBED o ABC Q ABA ,0?BAC rDB<@BBD D(F0N (C ABBH D\tLyBHE A(A0B (A BBBF J (A BBBA c<pBEB A(D0r (A BBBI 4 (L DX<l BAC S CBB Z ABA h ,, BIG X ABC , nAG V AA E AA $0!<(!!LT@!BBB B(D0A8DPh 8A0A(B BBBE !x!4p!aBEA A(D0M(A ABB$ !dAIG@PAA<4!BED I(J0_ (A ABBE TtP"BEE D(A0D@ 0A(A BBBE D 0E(A BBBE ""#58#'LP#uBEE A(A0s (A BBBH [(A BBD$d#KAG _ AH $#CAG W AH $#KAG _ AH $#CAG W AH L $BBA D(D0o (A ABBF D (D ABBA ,T$aAAD Q DAA L$BBA D(D0d (A ABBI Z (A ABBA `%X%#p%/4%ADD  AAF DCAT Hl%2Dm,&AAG w AAA L&aBEE E(K0C8K@,8A0A(B BBB' ',4'BAA  ABA Ld0(BBA A(G0q (A ABBD (G ABB(4(AAG f CAE _ CCA 0)FAe J Q$$`)]Aa F Q E L)Wd)#|)#*68*6`*h*.<*BBD D(D0 (A ABBE 4+3nLL(+TBBB A(D0 (A BBBJ  (A BBBH L8-BBD D(D0 (A ABBA D (G ABBE 4-wADG | CAD D GAL $ .A\ C D.)$\.zD E ^ J F/`X/P/H/@/8/0/,(/D /#\8/#tP/I/M@0H0-`0:0/,0nAAG N AAG 4407AAG X GAG DAA$l0=ADG nAA,1BAH Q ABA d3BEE E(D0C8G`z 8A0A(B BBBE - 8C0A(B BBBG ,,H9\BHD HAD,\x9BAA v ABC L8:BBB B(A0A8JL 8A0A(B BBBF ,;BBGA tAB ;A~ A 4,XtBLI E(D0D8D 8A0A(B BBBF  8D0A(B BBBJ Lt CBBD D(G@m (A ABBJ y (A ABBA D pEBAD G0^  AABH   CABH L !GBBE A(D0 (A BBBK q (A BBDF ,\!HH_BIC MAB<!xHADG i CAG N AAP cAA4!HBHG w ADC mABL" IBBE D(A0 (A BBBI v (A EBBH DT"JBDA D@  CABD D  CABA "(K " KG"XKG"Ka,"KBAD  ABB ,,#LBGD AB\#XM,t#`MBAD P ABF 4#MAAG f AAG c DAH L#NBBB E(A0A8DP 8A0A(B BBBG 4,$OBAD { ADI CAGd$`P-RRL|$xP2BBE A(D0q (A BBBJ o (A BBBJ $hQCAO H g4$QBAA \ ABE A ADB $%R7AR E ^D%0R6dN$\%XR7D[ I F B FD%pRBDA @ ADD T HDH A CDH L%RBBH H(G0| (A ABBC T (G ABBH d&XSBEE I(D0A8GPl 8A0A(B BBBI _ 8A0A(B BBBG d&SQBIB E(D0D8GP 8A0A(B BBBK j 8A0A(B BBBD <&TeBED D(G0@ (A ABBD ,'U#D' U\'(U$4t'@UwBDC ~ ABF W ABF 'UA[L'UBIA D(G0r (G ABBK  (D ABBC D((WBAA h ABA A ADJ A NBJ Ld(WyAAD0 CAK K GAM V CAF d CAH D(XADG0k AAG D CAA g GAH L(XYAHG0G DDI n DDJ N DDJ NDDLL)YBID A(G@n (C ABBC ` (A CBBA 4)[BDA y CBK qAB\)\BIA D(G0m (D ABBC K (G ABBQ G(D ABBT4*p\BDD  ABH n GBI B ABC q LBQ \*]BBB A(A0GP 0D(A BBBG  0D(A EBBF T*h__BAA O ABJ P ABU A PBE Q AGG LD+p`BHD Z CBC S ABJ b CBI GABL+@aBJE E(H0G8D@S 8A0A(B BBBJ L+aBJD A(G@^ (A ABBD D(I ABB4,a2D mL,b9G q<d,0bADG j AAH N AAP DFA4,bADG i DAN d AAB $,cAk L ] K jd-pcBBA A(G@ (C ABBD n (C ABBJ  (C ABBD l-gSBLB E(D0D8F` 8C0A(B BBBH J 8A0A(B BBBD  8D0A(B BBBA [ 8F0A(B BBBA L.`kBLB E(A0A8Dp 8A0A(B BBBF \T.oBHI D(F0G 0C(A BBBJ  0A(C BBBF L.@qYBBE B(A0A8Du 8C0A(B BBBF d/PuZBEB B(A0A8Dp 8A0A(B BBBA  8C0A(B BBBA 4l/HAFG s AAE D DAG /</BAA G0  CABD F CAB/$DU G D0BDD V ABE \ ABI A AGA 4d0\ADD { AAJ DFA00.Db A 0І DT A 0І0Dd A 1,1D1 \1؆.Db A |1D1Df F J F J F J F J F J F J F J F D1XDf F J F J F J F J F J F J F J F 4$2ЇdADD O CAD ` CAA 4\2gBGD N ABB d ABA 2@&DZ A 2P$DX A L2`BDB D(A0x (A BBBD o (A BBBJ L$3)BEB B(D0A8Gp 8A0A(B BBBG t3 D3$BAD G  AABE i  AABK 3%OT43fEFG w AAE DCA,4H4D4p\4ht4`4h4`D4XBAA G0Y  AABH D  CABF L5BAD D0i  AAGC D  FABC D CABT5 l5 545سAAG@` AAE O AAG 45@gAAD X CAF f CAF d 6xBEB E(D0A8K 8A0A(B BBBB b 8D0A(B BBBA t6fS p E H6 HL6BBB B(D0A8DPo 8A0A(B BBBF 6>H i<7BBD C(GPf (A ABBB T7Pll7HBBB A(D0D@ 0A(A BBBE W 0C(A BBBG D 0C(A BBBB 7ط7( 8F$80|<8(jBBB I(D0A8G` 8A0A(B BBBD Z 8C0A(B BBBB W 8A0A(B BBBG L8 BAA D0  AABD X  AABD D CABd 9ع6JAC G@W  AABH k  AABI Y  AABC `Lt9BIB B(D0A8D` 8A0A(B BBBG L9BIB E(A0A8D`7 8A0A(B BBBG L:`=BBB B(A0D8DP 8A0A(B BBBJ 4d:PLBED G(G`l(A ABB4:hLBED G(G`l(A ABB4:>BED F(GP_(A ABB4 ;>BED F(GP_(A ABBLD;BJI I(D0A8D@} 8A0A(B BBBB 4;ZBAA D@n  AABA 4;(ZBAA D@n  AABA L<PqBHG D(G0Y (G ABEL K (A ABBG T<Ll<xBBB E(H0C8DP 8A0A(B BBBJ <<<==%4=L=V~d=|==b=<=@6=hF=C >C$>DWD>\\>BGB B(A0C8G`r 8A0A(B BBBD D8F0A(B BBB4>XjBRD D(G0}(D ABB4>jBRD D(G0}(D ABB,?kdD? TBTA A(  ALKH p  ABBC A  ABIC d  ABHA 4?BAD D0n  AABA ?p= RT J f J f J S E j F t D _ A t D t D j F \ D j F | D \ D X H d D B F E A ` A C A ` A C A ` A ` A ` A ` A ` A ` A ` A ` A ` A ` A ` A ` A `T` H ` H ` H ` H ` H ` H h H K E C E ` H C E ` H ` H ` A ` A ` A ` A `d|A7BBB H(G0D8DP 8A0A(B BBBA x 8A0A(B BBBA ,AYBGA } DBC B 6^,BHaDb J M E LLB{BBD A(D0Q (D ABBI D(A ABBB#YLBBBE B(A0A8DP 8A0A(B BBBA CSgQ4CZADI X AAH `DALTCBBF B(D0A8G` 8A0A(B BBBA ,CyAMG8N AAK CfA`dC@BBB E(A0A8G` 8A0A(B BBBA 2 8C0A(B BBBA <\DBBD A(GP (A ABBG DAP,DlBID  ABC DH ,E@'AKJ  AAA 4E@ LE8WAQlExBD}EVd h$EA@ G c A ,E`ADJ` AAC LEBBE B(A0A8G 8A0A(B BBBG LDF`{BED D(DpV (A ABBA { (A ABBA FLF{BED D(DpV (A ABBA { (A ABBA FG3L,GBED A(G@v (A ABBA W (A ABBC |G$G&AAG PGA|GBEB B(A0D8Hb 8A0A(B BBBD x 8A0A(B BBBF & 8D0D(B BBBJ $  },,EM;;.L;L L JZ Z  77@wgg Yrll!Wqq"Xkږxx#ǎ>$u͕%o&vp'y  (wa+)>~*G0  +kZW,i CC-   .l/~01 2f34f' ' 4v==5=@3 3 68+n>>7!XX8Ltj j 9%$uu:Eޫ@zz;,i~~<{."u S $H"P"op  "N6H o@6oo4o"SSTT&T6TFTVTfTvTTTTTTTTTUU&U6UFUVUfUvUUUUUUUUUVV&V6VFVVVfVvVVVVVVVVVWW=,P@0 GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44),PX ,L `\, @bZ,"c{,b {3 <{` W ,P ,{`<Qp57@W ,<G,FPP,JQU.,o@E,Ђ,x,up,5 , , ,pJ,q5,a,A,,E H .PX : 87int<7iYiq22?      .| | T| | | B| B| | | | | | { [{ { [{ K{ { 5{ { 7{ { { { { h{ m{ { { { '{ { g{ { { { Ix x x x x x # 3 - | ?EU |& ag - - .  - (W \ +` d 3h Ul  m t%&"('-( (*pq,pmem.|mQ0-3-|5 v"6-d? v 3H?.# (0l8\@@HPXO k` qh ?pE?tzpxMM[wk~&{/0123-q5?c7k65k+q ?:3 -pq-i--j--a.vb/v7PXwopq7(7-Lj.8-pX>   $!"G"jaXpqa(a-#ib-_#jb-Rb- X0q R u !0""$ pY ^%pq U&| T%mem |Q$'(Ypq(>'Y (NC?Y}1pqCVCv)Y=#nqE[*F-V+Z ,Qv3$+Y,Us(XYv0Z_%pqYU$^vPZ7pqv~-Zo,UU,T0$Zu pqVv. p/Z ,Uv0Z ,UU1[_1+[o+J[/ ,U M,T @,Q,R p u (?P[  %pqU(-`[ %pqU$3p[y pqUfunarg?#i-#rv?N /[^ ,T~+[o,U|,Ts(?\] pq fun arg #i- 28\,T|3<q3q4 ( | 5 +/ | -6 D T .`\: 87int<7iYiq2?23T  .| | T| | | B| B| | | | | | { [{ { [{ K{ { 5{ { 7{ { { { { h{ m{ { { { '{ { g{ { { { Ix x x x x x #   4 - | @F V |& bh  - - .   - (W \ +` d 4h Vl  m  'E )?o*key+T,E - /.v0mem1t`2- 3 4? 5J0 6H ?  . #  ( 0l 8\ @@ H P XO n` th ?pE ?tz pxM M [ zk ~ &{ / 0 1 2 3-q 5?c 7  n65 n+ t  ?=6 b-ob b f- f fbktgidxg-z=bktzozkey{T{ kbktkkl lhmkeynToo^key^ ?`\.vU .  g o key7 T idx- d-' dd- bkt !j\ " " #=\`"j?"_g"T"I$`%u%~% !\Z"C"y""&\h""'\(1Y(&X"J(Q ?] map   ? i)  bktD rv?* +1]-J ,T| ,Q@+v]n ,Uv,T|,Q}-]L.]b,U ,T ,Q,R    /] $]" 0map$ U0mem$T/,^D map, 1^L/4 ^L map4 ,4 hptr5 i6 bkt772Y^,T| ?  3 D?p^Z^ mapD {,D ptrE rvF?_ iG bktH2^,T}/n ^( map  iIidx- bkt#^ "3"W+(_ ,T ,Qs,w0.X_,T ,Qs3 ?p_] mapڷ key>Tڍ rv?*m !_ "+_ ,Us,T@,Q4+_ ,R |y,X|,Yv+_! ,Us.`b,U ,T ,Q,R m ] 3 `map 0keyTh idx-U bkt d-)4+`""56`4"6U`0 "@"""<'h``h""s7y?`78map U9key:h;idx-"4}a 4_"a""">>'}aPh>""6a9"1""&"""")#? Ib(9mapI L#.b,T07 R-0b 8mapR U@<t@t@ tA2 *L  - -B (b  B D T Cd?  DE+ ? . @bZ2: 87int<7q2y2  .| | T| | | B| B| | | | | | { [{ { [{ K{ { 5{ { 7{ { { { { h{ m{ { { { '{ { g{ { { { Ix x x x x x " T#w 75$ % '' < (' q ('B ) P @bcJ cU- "Pb$J "c#p&'#`b 75('-$lbI /?bW9J /cc$T/w$ 0's%b[U@ v AbPJ Ac%< B'\& pbIcI0cqU T QCR pyp. Kw0c,qJ Kc& P\cqU T QLR Pypqc Pw`c-J Pc& 0cqU  T QQR 0yp U?c IJ UcU[w+wq-DTZ@?.c{l:7: 4int<7pYpq2F2  J  F  90M1T3[ \.||T|||B|B||||||{[{{[{K{{5{{7{{{{ {h{m{{{{'{{g{{{{Ixxxxxx n("%&7(\len*;ref,  y (:$G\ T\oX;_\;H` Aah \ *7^   ' Fc  5X l w  NL0  _P  I   DmQH;HPLP HT ]Y ZNGhdHxM; LNY;3 p }3HP!{ @hdx;f3nva(;0cat8$ ? hdf3 jhd;\ *E   ehdniv;ive* N60hdx ;nva;  (], w%hd)-   W.05phd9&=;\AE\ I; ]N( }OVhdZY^]c d|khdo+w x@thdT rVk_ p ext Ntb #   ; |  |&   ; ; . ! ' @ ; (W \ +` d h l  m @   \; \.;   \ ; G   4 nov;ov#4  $ Rw HPV [\._; ^`F  X ctx  map E @A ;@ ;H P( %!  (\end +\pos .\ 1\Y 3\ ^ 4  |7 0 \ 75 \ buf ! , @ / \ cur \ mem / ; ;  ;(v ;0 ;8  b  w P / nv h cnv $75 s @seq Ho L yh  | r H < /   > ^ ; ;len ;s  y @  i Ÿ mem  ;(I ;01 8bad <m  5 .v 5 s E    H F  . #  ( 0l 8\ @@ H P XO  ` h FpE Ftz wxM T b k %~ & / 0 1 2 3;q 5Fc 7+  65 +   FP % ; sF a!@; b!x;"rvFF lhs rhs"a"b"rvF$# y" bufy"!xy;! yF$rz;${;! D1F!1! 2"buf3""ci4\ "ce4\ "hd5 %5&hd5'mQ5;'5'H6'HP6(;!H( !; !V! )d!Vd!;!+\!H;$Fj"p\ ) nva mem *;c_+L+'+V'+bg(+l),x)-cV+l)+b)+V%*+Lq*.c,x*/c_>0UU0TQ0QT1c_>}0UU0TQ0QR2c_>0TQ0QT*dG.+*+B+,*,B+,+3 +++&,45556?d;7 d;8h%Pd69buf%\_,9hd%,1fd~>0Us2d~>0UU#*(d<+E -:99:99,QE-,]-,h-;sP1d.0Tv1e.'0Tv/Ce.0Tv8@-PeD9hd--9buf-&.1de>0Uv/e>0Uv*e:U:T:Q:R:X8<>eQ r..>+r.2f>0UU#38O fI0UT8S0f$@VSU@HPST@fTQ?0fU:T>>>:U8Z`f@VZU8\pft@V\tU@HP\T@;\]Q?pf^:T>>>:U8cf@VctU8ef&/@Ve/U@HeTAivfeQAnivf;RBf0g>:T>:r6:Uk8gmf0UT8qf.+@Vq+U@HqT@HPrQ@ sRAnvatX@t;Y?fu:Q:T>>:U8M}g0UT8 g9)@V)U@HT@Q?#g>:T>>:U 84`gZ@V)U8pg-@VU@&T@;\Q@\R@ ;X?tg>>>+2:Up8\gJ0UT8>g@VU@HT@HPQ@YR?g:Q:T>>:U8g@VUCd;gD@VU>:U8 h@VU80h@VdU@T@HQ@HPR@+X?0h:R:Q:T>:U8Ph@VdU8`h+k@VdU@HPǵT@\Q@;R@ \X@.;YDFjP?eh:T>> +3:U8 ֐h"0UT8ohI@VdUAov4 TAnov;QE4EH;5Fi;S5?h+5+5+5+5+5: 8^i"0UTG@i) HVdUHHPTH \QH.;RI PJDi>>>+6:Uw Gpi" KVdF7Lmem 7M 72i>0UT*i!:U*iV!:UJi":u Gi,!Lbuf\'8Kfs8/i~>0UsNiFi7#Ki8KVi 9Kj7#D:$ k;OrvlF:Obufm";PM# Q j`qy"+T;R j"+;1Jj>"0UQ0T}1vj>"0U}Sj"0UU0TU#0QTT9U1jV!"0Tv/j ?0U 0T 0Q o0R  M# =#GLj8#Kf#&<K+<Mx<M{=M!d=1j>#0Us2k,?0UU3G k/X$KV =K+>13k>J$0Us7MkR#GuPkf%K~>KV ?Obuf"?Pv% 1k.$0Tv1kV!$0Tv1k ?)%0U 0T 0Q 0R /k ?0U 0T 0Q 0R v% f%Gk %KV?K+/@2kR#0UU#0TTGqk&Kh@KVt@Obuf"AP& 1!l.Q&0Tv7-l~>1Xl ?&0U 0T 0Q 0R /wl ?0U 0T 0Q 0R & &G5lD'KVtAK+B/l>0UTN;l\'Lbuf\PBLiv'BLniv;BOi;3C1lM?'0Us/l~>0Us|'*NFmt(KCKV/CObuf"iDP( 13m.X(0Tv1GmD'p(0U|/tm ?0U 0T 0Q 0R f%Gm (HV/UUiveTUniv;QGm,d)LiveDK+D1mc?O)0Uv/m>0UvN  FmR*K R*&EK X*EK+IFKH;FLmem 3GOi;G3*Ooff#;G/Hn(0Tvz/nx?0UX0T&R4--@-%42%3$e;N*Fpn+K*lHKV++IK,7#IV -;Orv.F@JObuf/"yJP+ `1n>+0UQ0Tv7n~>1n>3+0UvSne+0UU0TU#0QTT9U/o ?0U 0T 0Q 10R `GM o&+KVM+JK+NJ/,o>0UTGUPo-KU8KKVU)KObufV"aLP- 01o.t,0Tv1o?,0Tv0Q81o ?,0U 0T 0Q X0R 0/o ?0U H0T 0Q \0R 0- -G,fo^-HVf)UH+gTNkFoY.KkLKVk MOrvlFMObufm"MPi. 1p.-0Tv7 p~>74p~>1Ip?.0U|/|p ?0U 0T 0Q o0R i. Y.G pE.KVMK+NK\bNK;N1p>.0Uv/p>0UvNFpd/KVNK+OKH;PLmem gPM\PM;Q1px?/0UR0Ts1q?/0Tv0Qs/&qn.0U|0Tv0RsG@q0KHQKVQObuf"qRP0 1qq.R00Tv7}q~>1q ?00U 0T 0Q 0R /q ?0U 0T 0Q 0R 0 0G qE1KVRK+R/q>0UTG3q2K0SKVdSOrvFTObuf"`TMFjTP2 1(r.10TT75rM?1Ir?20U|1]r?20U|1r ?[20U x0T 0Q 0R 1r ?20U 0T 0Q 0R /r ?0U 0T 0Q 0R Y.*r)3+T:)T+5 U:AR;MP,Y@UNFrX4KVdvUK+UKH;4VLmem VObuf\VM;:WQVs4+ApW+5W+)W+W4,MX,Y3X1#sc?40Uv1?sx?740UH0T~/Vs?0Us0Tv0Q~NFsZ5K}XKVdXObuf"QYMYM 4 YOi;YPZ5 1s.50T}7sM?7 t?/^t ?0U ت0T 0Q .0R Y.N3F`tf6KV3dVZK+4ZKH5;i[Lmem5 [M6\Op7\Oend7 ^Odst8\^M9;_Oov:4 k_Onov;;_Olen<;M`1tc?V60U~16ux?z60Uw0T|"1auc?60U}~/u?0U~0QvG{u7K{`KV|dbaOrv}FaObuf~"aM 4bP7 `1v.F70TT7v~>1%v?k70U|1Mv ?70U 0T 0Q 0R `/lv ?0U 0T 0Q 0R `7 "7G pvt8KVdjbK+\bKH;cM /dP8  1v>80U|/v ?0U 0T 0Q 0R  8 ,8Nev?9Liv'edLniv;dLmem dMe#eOlen;Fe1wx?h90UQ0Ts/$w?0T|0QsNF0wv:LaeLbeP: 7w_>1w_>90Q}1w ?9:0U ©0T 0Q 0R /x ?0U ҩ0T 0Q 0R : v:*px:+}ef+f2x>0UT0TUNF x%;LlhsfLrhs6g63x;G@x;LnvaogK;g2Qx?0UU0TT0Q(0R dN_ F`xy<K <gLnva ShK ;hLmem  7iOi ;iMT\iM7;CjOpj1xx?J<0UR7Ly@1y?o<0U|/y?0U|Nt PFyc<LivP'jUnivP;TOiQ;(kGPz4>KkLhdkKx;olK FlObuf"|mPD> ЫQ{z =+m+m+m+9n4 , on,n1z%@=0Q97z>7z~>/zD@0T00Q}/{ ?0U h0T 0Q 0R ЫD> 4>W< W Xj AF~> ;Y8> \ XD> Z~> #Y(> [ NF> 7#   ;[ ; ? YD,? [ ZlM? # FY 2c? \ Xf>x? X '? ;Xzx\? \ ;[ F?  ;\? ZX@ ; ; Y#F%@ \ ;X? .D@ ;]+ F _ . {3 : 87int<7iYiq2290Fi P  .| | T| | | B| B| | | | | | { [{ { [{ K{ { 5{ { 7{ { { { { h{ m{ { { { '{ { g{ { { { Ix x x x x x - 7- len-  E # V\p- | | |& -- . - (W 3 \ +` J d p h  l  m (%(-end+-pos.-1-Y3- ^4?|075buf@./curmem./ -- -(v-0-83H?.# ( 0 l8 \@ @H P X O `  h  ?p E?t zpx MM [  k ~&{ / 0 1 2 3- q5? c765+ ??*-Mbuf-Mmem-./ kbuf M(?buf(MH(-mem(.y/?/rv0? 14k? krvl?bufmM!y?Uy/ y-z-z-memz.TbufTMT-lenT-!#-#ci$len%-PbufPM"S {(#_U"*P{6$6n$Ao%d{(&UT'6?p{(buf6MZo){6-o(mem6.gp*ptr7-p*cap8-Nq%{>&UQ&Q|"k|,= ${q$q$r+S|') $_q,,|6&UU&TT&QQ-[?0|: )[: Hr)/ [-r(mem\.s.rv]?/k^|Pf $es$s${s+Sh|() $_s%|6&T|&Qs0J|]% &Us&T0%|(&Us"|n $ t112|7$t2|73t4h% }= &Uh"@} #U"UP}! #aU$lt#wQ'4?} )$u)/ -u)-u)v-Av)-v(mem.v*rv?^w5%}= &U&T}&Q" ~R $w$(w$3w$>,x$Ixx,~ &UU&TT&QQ&RQ&XR&YX't? ~( )tx)/ t-x)t-6y(memu.oy6 #~ v$Iy7>$36y$(x$x,.~ &UU&TT&QQ&RQ&X0&YR8oK omemo.9i0~a)z:Sz:z;( W~$? z$4 {/*W~p $Az$6Q{%f~(&Uv%y~(&Uv&Ts'e?~d){)/ -{*rv?#|5X0~= &UX&Tv%~K &Us'?\)Z|)-|(len-j}(mem.}:̿(~/U8A$wr~$l~$a%3]&U}&T0'?`)o(vec`) -(mem.-*i-:5H:: 6+U()$wς$l$aP0]G&U~&Tv,&T0&Q0f3ƀ(.K +].-K 'w.-Lz x---i?. ' o7: )int<7eYeq7 e29 m^;5e2;   90B1I3P57)e P;"c " Ε "B 6 S%ӡ ,ա Y(١0 L*ߥ"Haob  8!  <#B8 1( mem e0 /8 "@ g1H $P 5*"X F2 ` j"0 E80 K40 <5 0 700 !0 80 70 , 0 y#0 x&0 z(0 0y+0 O2.0 C0% +4  76 >P: /=% Z8? &A QD g\H FFL |&O JdT r,W h;YD"$ X[D"D 1]%d +`%h >"c%l *fp Z5iq U0lr Yzns %pt  "su 2wv 2~!w (" % &. 7(len*0ref, (:;G ToX0_\0H` AaDmQH0HPLP HT ]Y ZGbfdf;ptrjz!k9    0   X%)(.M[   0   #!'9+.,[6!:9> )?GhdHxM0LNY ;3p }IHP!{@hdx0fInva(00cat 8;U hdfIjhd;\% @E % {hdniv0iv{@NL0hdx 0nva0  (],% hd)- # W.05 hd9&=;\A%E I0 ]N(}O/ V hdZY^]c d k hdo+wx @ hdT rV_#    ext N $    0 ;  &  M  0 ; $)'  ;E  E 0   #LW ]    0 ; o9l  M   0 ;    ;      ;  ; .' - ;U   0 9 R* " 9!9  ;  % '~ )  ;  0 0  B-  ;3  3 3  / a24 )P] c   0  2i  M  0  1     % 6 M/   % Z!;A;Z  Z `5qw;  Z 0 7 ;   Z 9-    0 7P M:   0 B3n FL;j  0 0 v|;  ; 0 1 1 % $ , & 3  &# :K  w9 A  F  K ( . P 0 9 TU 8 Z* Xa @ " ]m H A! ay P ( f X ) k ` J- l h / r9 p i2 sE x ) zQ 2 1 6 b! / ,) 9  7  %7  5 e J3 : 0 j# . 0 | :@P |& \b{ 0 0 .  0 (W \ +` d .h Pl { m  ;0 .0k 0G  Gnov0ov#k$wRHPV [._0^` X Bctx $map U@ A 0@  0H  P4#N4# 6ctx $ / H@ 2 H " p - 3 u+ 3 * 3 % 3 20 0 ( 0 6 0  0 $ 0 8 f - j , ( %B%  bobq  -9 0 (9 8 1 0@ 2 0H 1 0Pseq 0X / ` 0 h 8 p 35 x v/  Z/  e V p g+ 0 HP Q g\ FF |& Jd ! P# % @& -  * , % H  8  2  2  A  3 '-66/-q)"-& 9H  ;u" <3t %(% (end+pos. 1 Y3 ^4^|0 75buf@M /curmemM / 0 0 0( v00 08 wiP nv cnv ; 75 @seq %H o %L y  |3 3  r  H < ^ 4 > 4 ^ 0  0len 0  f?7#!8 E `45o82'B$ 3A $4G1 , 8 2 9 q@ $ i :mem M  0( I 00 1 %8bad <m   E .v EU /! I"FJ;"K"L^-M`* !+ 9,!)#$v1.$v2/W,' ,x(; `(0W,1( ;\A% 6D$#E HdpwL HTeofY 7]8^Ll Hn0or 7u0v!(y"Tz" {A"|$ext}v*~00p V f-@ ~*` 20 s0p 2 /p "pn0v 'E ) o*%key+ T,E - /< .v0<mem1M t`20  3% 4% 5&b ('0(M(*q,mem.M mQ00 30 |5S b6m 1)e&2x-!+.U" C E 51*f/4& N PkX)24,)%1q. * 3 i'5%-9++. (8$30g W65 Q9!%*!&6 H;   . # (0l8\@@HPXO ` h ;pE;tzlxMIWk~&w/01230q5;c7% 65 + ; p# "2 E$0 !K&0val(0 $+0p#,H^ 6 &$:,(M= PO VPp E2QS -R^ H7Si v!,"<9!(;6/'?)( / ;. 2 / Y34$S'5- ! V f-@iv{` +h 7 7niv0 -0 +00 x0 -! *!!r''! D" ]% *% x% .-% % #% b5% ]0%#!'" 75"iv{niv0O"'O"(ݥ" H#޼"""&43z;"'%z(Y7")%($#*a*b(#9#),)%(#x#),)%+35,###x#(/#)%*dep-60#)%0.+#'%'10/X#0&`#;1$'40src'%&O&;M$'%.v6}$'%/,,$v6$}$-8(;$)%1rv;-%0;$)2h0)&1)*-2+&32!7'%)%7)!83(/;`/}%4q*/U4-/T5lhs0}%U5rhs0}%T%636;)&6,z6%֔7rv;Y8#υ&9#9#:;#<>=Uv=Ts>9# W &?^#@R#R#@F#F#Aj# <@W>=U X=T =Q =R >1$@2.'9A$28"D&9"29"2B\9A$M$(9Y$Ζ;d$*Ao$ pC'@Y$SB?d$Ao$ p<">=U  =T =Q=R pD?(=Uv=Ts<1$=UvE'<0a(6%<6HP<җ6H= 6.=Y6!>63>4s%?4e@Fmem@M$*=U|=Ts=U  =T =Q=R p*`*E(Z+6%6!^H,כH107H9jH$0J#`!&+9#79#:`;#TD׉?D+=U}=TsG]>=TU>$`+@%U9%wK+;,L%LVpk1rv;I, M$;,9$4B;$m<Ċ%=TsD>{,=U x=T =Q =R <>=U =T =Q =R ,,( 0,)%Nm3 Fa-L%O,P9,DY?J-=UsGfM$=UUN7p]>.L%dLHI>. PJ,.9,aD?-=UsGM$=UU<͋>=U 7=T =Q =R P`*K ;ЋW'/L%LH"I7/  M$$.9$B?$G%=TU<'>=U 7=T =Q =R  7/#'/K+';0#m/P%'UK .+;`#/P%+UK3=;6=0P%>UL&>ТL*-? Q$5@9$ 9$Т@$uB5A$TK]%E;Ќ60P%FUL&FBL*-G{Q$Ќ5H9${9$B@$uBЌ5A$TN!M 1P%MUK^$R;0.J1L%RP"STK%\;`h2L,\L%]IRsi^Srv_;PJ#0k529%$ޤ9$9$$:09%$ޤ9$9$$D?2=U}=Ts<%=Uv=TsD1$M2=Uv<%=U|=TvN9 3j3L,GL%O9#5`9R#9F#:`;^#QAj# M"<39#Q9"tM#D G39,#9 #=U P=T =Q =R DȏM$7=Uv<>=U D=T =Q =R `*Kg74;9L,4L%5+66U07ORsi81rv9;M# D89,#9 #M# G89#:M"I89#]9"J#$0 Qp99%$9$ư9$:0 9%$9$ư9$DH?T9=U}=Ts=U D=T =Q =R b<!R<K3;В)<P%UKx1pz&=L%nRentRsiM"%=9"I9"IW[?Ky0'`W=P%UKW.=P%UKi(=P%UK'=P%UK#>P%UK+ L>P%UK40}>P%UK*@>P%UX<XYNL;> > ZD? P Y];? >Zz/? > Z;J? > S MZ'A[? >[XR >}.w:P : 87int<7q7 i29 my?290F3T578i P"" (:Y G T oX- _\- H` Aa h \  *     7  ^   D mQH- HPL P HT ]Y Zb5fdf?ptrjw z!k 9MS-w5 )-w # !'5 9+A ., 6% !:5 9> )? GThdH xM- LN1 Y ;  3  p` } HP ! {  @"hd x- fnva"( -0cat8Y  Whd f j4 hd ;\ c  E   hdniv-iv N 0Zhd x -nva" -  ( ],  %hd) -p W.f 05hd9 &= ;\A E  I- ]N( }O V8hdZ Y^ ]c d kghdo +ww xD@hdTT (rWVZ_ 8extg Ns # $w8-w | DJZww |& flw--w . ww-w (W  \ w +`  d 8 h Z l  m  E  -  .-  u   - G  Q nov-ov#u $ R HPV [ ._- ^` I# FJEKL^-M*O !+59,w)q . v1.v2/%W,' ,x(?`(0O W,1q (< dpw= e>w;\A 6D$#E  H dpwL HTeofY7]8^ l> Hn0o) r^ 7u0vI (y Tz  { |> ext}^ v*~i 0 0 Vf-# @~* `2s0 2 : / " n- : P# dpw U!`( T  =:, # dpw, U!`(- T %":8I !V8 U":@c #V@ $mem@ͷ%VA &s  ' %~*fx i( )U :)T ʯ)Qz)R  *;*X*j*ŕ*%*-*5*=*E*M*U2*]O*els pc ^ "[:Е q U: ":- q U!V T": : q U%V _+ D;T,/RRg,jR,  R,^R,\,8,=T,(,W,,,,gII,MffZ,4~~(.N`K:7: 4int<7pYpq7 pF29 miF5p '2 % F9 9 9? 90M1T3[574B(w @ P[O[<G=Bblp P"" )"  ѓ S% Ӭ , լ Y( ٬ 0L* ߦ%Haob j#8 $ *<# 81 ( mem  e 0 / n"8 " n"@ g1 n"H $ n"P 5* %X F "` j" a E8 ; K4 ; <5 ; 70 ; ! ; 8 ; 7 ; , ; y #; x &; z (; 0y +; O2 .; C 0V + 4  7 6 >P : / =V Z8 ? & A Q D g\ H FF L |& O Jd T r, W@ h; Y%$ X [%D 1 ]Vd + `Vh >" cVl * f@p Z5 i@q U0 l@r Yz n@s % p@t  " s@u 2 w@v 2 ~$w Y.||T|||B|B||||||{[{{[{K{{5{{7{{{{ {h{m{{{{'{{g{{{{Ixxxxxx@k ( " % &>7 (Ylen *;ref , (:GY TYoX;_\;H`@ Aahc \ *7^   ' Fc  5X l w  E5L0  _P  I   DmQH;HPLP@ HT@ ]Y@ Z5bfdfFptrjz!ksLJB G9   Y ; & V)8 > k  Y ; & # !'9+.,k 6 !:9>,  )? G hdHxM;LN Y ;3p  }Y HP!{@( @ hdx;fY nva (;0cat 8e   hdfY j  hd;\V  P E V,   hdniv;iv P N\ 0 hdx ;nva ;  (]@, %# hd)-# @3 W. 05 hd9&=;\AVEY I; ]N@(}O? V hdZY^]c@ d k hdo+wx @ hdT   r  V  _3    ext N $   ; F  @&    ; F $)''- FU  U ; &  #Lgm   Y ; F o9l   Y ; F   F      F+   F .7= Fe  @ ; 9R*"9!9 F  V '~) F    ; ; @ B- FC   C C @ _/a24)Pms    ;  2i    ;  1   @ V 6  ?  @ V Z!KQ Fj  j p5 F  j ; 7  F   j 9-    Y ;  7P !' J  Y ;  B3n V\ Fz  ; 0  F  F ; 1  1 %$ , & 3 &# :[w9 A F  K(. P+09 Te8Z* Xq@" ]}HA! aP( fX) k`J- l h/ rIpi2 sUx) za2  1 6 b! ?,) 9 7 %7 5 uJ3 J0 z# $* > ; | JP` |& lr  ; ; .   ; (W \ +` d >h `l  m Q^w  Q^ P E TaK Uax Y;Uy ];y a; z e;(0y i;0^ nV8}x rV<x vV@>" zVDz ~FHz FL y FPS{ FTy FXRz F\z F`2 $d`(2J/Vinc6F`7  |Y; Y.;>Y ;G  nov;ov#$RHPV [Y._;^`6X ܃ctx map E@A ;@ ;H @P4# 4# wctx / @2 H" p - Cu+ C * C% C20 ;( ;6 ; ;$ ;8 V- j @, @( @*EbH H% %P obq&!-90(981a@2aH1aPseqaX/n"`0n"h8n"p35n"xv/n"Z/n"eV{ g+;HPQg\FF|&Jd!P#V@&-^!*,VH@8@2@2@A@3@ ' E )o*Vkey+VT,E -a /.v0mem1t`2; 3V 4V 59;Ku"<t% )TvAWbsDxc(%(Yend+Ypos.Y1YY3Y ^4T| 075buf@C/curmem/ ;; ;(v;0;8 wY P nv cnv 75 @seq VHo VL y |C Cr H @< N $> $^ ; ;len ;   V?7#!8 5  `45o82'B$ 3A $4G1 , 8 2 9 a@ i *mem   ;(I ;01 V8bad @<m ! 5.v 5E  " Iz#FJ|#K#L^-MP*!+9,")$%v1. %v2/ W,',x(F`(0W,1(<1dpw=e>;\AV 6D@$#E HudpwLHT@eofY@7]@8^< `D%bXlHn@0or7u@0v"(y #Tzu# {1#|%ext}v*~0& 0{ V f-z@~* `2as0{ 2@  /{ "{ n; & (';( (*!q,!mem.mQ0;3;|5  ! 6 1^!)e&2x-!+.U"C1! E!51*f/4&Ni! P!X)24,)%1q. * 3 in"'5%-9++. (8$30g W65 Q9!%*!& p# ""E$a!K&aval(a$+ap#,t"  3"YbCeOS_ TF  A#GYMO`  H2#6 &$:,( M#P Oj#V P{ E2 QC- R2#H7 S=#  v#,"<9!(;6/'?)( / ;. 2 / Y34$S'5- u#! $V f- z@iv `+ h7 7 Yniv ;- ;+0 ;x ;- #* $@$ r' # %] V* Vx V.- V  V # Vb5 V]0 V# $  P%]bZ2IK;W ' ƀ%75 ǀ%iv ȋ niv ;P%' P%( ݦ%H# &!%% % %"  & XA  R % 7&"  / n"& ,J FrR % 'HF.# (0l8\@@HPXO '` (h FpEFtzwxMTb(k(~&/0123;q5Fc7(& '65'+( F'C&( '.(   %(NRRjZaQ LPjYJM],] ?qb?N'H2F(("2 '?Y=F(("= '`HF)("H ';XF)("X '>_FN)("_ (%`n"(VaU)^Fl)*" )t=N)*"O *%On"*OP)] F**"  *V { *E2 *+rv F+buf *,mQ ;,V U,~* *Cu)RU;Z**8UZ*-inV *W $.zM*-q*-mem,V{ ,75{  'm]F*(K" (@.GB**V*%.N(+*" *%n",JV/8+N8+ (+.>c+*" *%n")U=IF+*"I *%Jn"*AK@.M+*" *%n"*H@)BF=,*" ***VU+rv+buf*,7;,yK;/=,B(+)]F,*" *%n"*H@+rvF)P_c;,*8cZ*-ind *d ,Le;.Y^,*8^Z**20^;)[MF-*8Z*-hd-)tN?FN-*"? *V@U+rvAF0UCF-*" *HP+remF'9>F-(" (HP'[uF-("u (%vn")?? F!.*t -ptr +arg !.,% n"/7.??7&7. '.'PnFc.("n (%on"1X4.*"4 *%5n")aW F.*"  *& *,J F+rv F,% n",_ n"+arg 7&/ /aW / .0C-n":/*"- *HP.15JTx/*"T *%Un",OVn",_Vn"'YF/(" 1\UD/*"D *%En"0FEF,0*"F *%Fn"*<G,0+rvHF,,In",GJY ,fK,0/G0F20Y G0 #70)#\Vj0*7\F)>F0*" *HP*VU*7\F+rvF)QF0*" *VU*7\F)CF:1*t-ptr+rvF+arg:1,%n"%0HF1*" +max;+rvF/1H2,/n",75n"1 "10=XF1*" *%n")_@>F2*"> *&?**-@+argA%)ZFS2*" *VU*7\F0@F}2*" *VU)D;2*" 0LF2*" ,D;)^"F2*"" +i#;)RF 3*" )DFM3*" *%n"+rvF/M3D70)X#F|3*"# *V${ 'YDF3(" (&(;\V(Iݻ3rvF4@ 4@;0RG F4*"  *;\ V*I )ELFD4*"L *VMU+rvNF)7FF4*" *>*6A*2@*HP*n`;*Jd,b+rvF)LF5*t-ptr+rvF+arg:1,%n")`\FD5*6A*&h;*Jd0[F5*" *%n"*n`;*aF+rvF0 ZF5*" *n`;+rvF)Z F5*"  *V U+rv F.`^+6*" *V%+i+6%)IFg6*" *&+arg%)Ab;6*"b *%cn",Od),O;6*" -nva6*;*x;;6)T/F7*"/ 'QPF$7(7\PF)H FY7*"  *V U+rv F0ZH F7*"  *HP *t` ;+rv F,% n")T.F7*". -hd/j+rv0F)\8*8Z*,x;)MF"8*" )EF{8*" *T -len;+rvF,8Z*,VU)zH8*" -bufY-len;+rv)q_ F8*"  *V U*7\ F+rv F)\NF9*"N *VNU*AO9-inOY*O;*^kPF*APF,>Q+rvRF,ePSF+nvT,%Un",XVVn",dWF2+rv2F;5(F`/#:6q*9U6-9T7lhs#:U7rhs#:T):5 [n:8" 8V8_;@9rv:N[;¾;͖<UU<Ts<Qv=F70;8V%>mem}?c;<Uv@.c<UT<TU=@M@=;>aob;>mem;?Ty;<Tv?_c;<UvAo<Usj#=G2=8"2 :83Z*9mem4B*\6<C*GC*?\<<Us<Ts<Q ?z<<U|<Tv?<<U|<T0<Q0?<<U|<Tv?P<<U|?c<<U|<Tv?x$=<U|?< =<U|?T>=<U|<Tv?cV=<Uv?ۙqt=<U|<Tv?=<U|?=<U|<Tv?'=<U|A><U|<Tv5BcFP@8UL@81@8e;8%F8Y^@>mem[9rvF:>;:Uy;9i;DLE^םE]`_EOPB*<>C*B*ߛF ?C*HF Z?:8wZ*A<<T <QH? ~?<Us<T1<Q ?+?<Usl<T0<Q0<R5<X@<Y0<w0<w0<ws?d?<T <Q!?Н?<Qs?c@<Us? *@<Ts?aS@<T @<R1<X:<Ys?wk@<Ts?0;@<TsG;?@<T `<QsG_1GnCGdGU @A 5NF`\A8t>ptrf:" f:%n":V{ 9mem$?yA<Us<T|?cA<U|<Ts?`A<UvAc<U|<Tv)Ca B-pq B,%n"&!5OFD8" `8%n"9rvFs:JV9incF9pq B8HD BA&CCB8IJB?qC<UvA<Uv?.DC<Uv<Ts?lC<U D<T <Q <R ?C<U 0<T <Q <R A<U <T <Q <R D DK ;FEL" L7\FXMfmtNO;iPap}QbufQrvFQmem?hD<U0<T0<Q|<R}?D<U~<T?ŢE<Uv<T<Q|<R}RAE<Us<T}<Qv?c_E<U~<TvRNyE<Us<TvAcc<U~<TvS`*BFCw*Tm*m*J*J*r?yE<Us<T|Ac<U|<TsS*УsGC*C+\J+U+ PVFC*C+*IW+U+ PA/<U <T <Q <R P?F<Ts?N6G<U D<T <Q <R PAm<U V<T <Q <R PS=+pAGCJ+MCV+F0 GCV+]CJ+@*<UU<TTA*<UsSc+W{HCt+C+zC+Xp Y+C+Ct+^?*]H<Uv<Ts@&B<UU<TTSB, I%ICS,C_,2Ck,Jw,F ICk,C_,RCS,X Ww,@i&B<UU<TTA7<<Us<TQSN-pXIT_-UCk-Uw-TKTF4IL" ILHPZN-Ck-3C_-IWw-A%I<U|<TsS-Х=JC-C-f[N-ѥ oJCk-fC_-X Ww-A%I<Uv<TsX C-C-AXI<Uv<TsS-KC-MC-J-J.MU. BN-$  JKCk- C_-AI$ Ww-A1%I<T|F@ KC-dC-X@ W-W.U. Aͦ<U <T <Q <R A<U <T <Q <R \|aTF -L]7\TFU5/RFmM8" 8VU:Hh9aob;:E2*:x;q:_;?/.:L<U|<Ts?<KL<U}A[W<U|<Ts<Qv<R}SN-plMC_-Ck-+Ww-@y%I<UU<TT^'cn",M8" w8HP :%!n"Ax<UU<TTS/%NC!/C-/X@ŧx<UU<TT^;FЧ6N8UL@81@8e8Y^@O>mem7rvFP_" hA=<Uh<TT<QQ<R0<XR<YX^6^F iO8UL@81@ 8eY@%N<UU<TT<QQ<R0<X0^;F O8UL@81@8e8Y^@=@(%N<UU<TT<QQ<RR<X0^KF09P8UL@v81@8e8Y^@4>mem7rvFP_" hAM=<Uh<TT<QQ<R1<XR<YX^AFp ?Q8UL@81@8e>@zO<UU<TT<QQ<R0<X0^KFQ8UL@w81@8e8Y^@"@O<UU<TT<QQ<RR<X0`3BS8" [9mem:V %29i!;VgR:75*%AΨ:<T|?R<U}s"(?`R<Uv ?R<Uv<T `<Qv?R<Uv?)ES<T|am*v?8E"S<T|am*v?GECS<T|am*v?V0;bS<Uv<T|?^;zS<Uv?jCS<Uv?v1S<Uv?S<Uv@c<UU#<TU^bn"tY8" 8HPz8H@8<Y!8.^!$8e9rvF:%n"-:,n":TF_GY :fY9memHY pb/p  1UC-/C!/8Ax<U<Tb:/ ,tUCS/CG/&X J_/Jk/b/ UC/C/$BN-VCk-ZC_-IWw-A%I<U<TBN- eVCk-C_-I Ww-A8%I<U<Tb/Э RVC-/:C!/]Aݭx<U?qV<Us?QV<U~<Ts?+V<Us?MAW<Us<T1?OW<U j<T <Q <R pGW?ܬ+W<Us<T<Q}<Rv<w<w?nW<U<T<Qs? `W<Us?cW<U<Ts?8X<Us?_UX<U 8<T <Q *<R p?rmX<U|?AX<Us<T2?X<U~?X<U|?WX<U<T?-X<U? Y<U~?ŮS7Y<U<Q0<R~<X5<Y0?wY<U <T <Q (<R pA$<U <T <Q /<R pY Y YS/0\C/C/gC/W/c/W0J0U0 F@ ;\C/C/NC/X@ J/ J/BU0@J0U0 b/ VZC-/3C!/VAx<U|?Z<Us?Z<U}<TsG?"[<U}?+:[<Uv?AX[<U}<Ts?m[<U j<T <Q w<R ? [<Us?[<U}?[<T}?-[<U|?˰\<UwAS<U|<Q0<Rw<X5<Y0?lS\<Us?\<U <T <Q N<R A<U h<T <Q O<R )6DF]*" *%n"*V{ +rvF^'M]F _8"] 8V^{ 9rvaF:%bn"::VcUb\ɱ r^C\]C\C\X J]+?Ա ]<U|<Ts?۲&B]<Uv<T|A*<U|VxX^:~*__fY P?4 k^<Uw<Q@<R0AS<Uv<Q0<Rw<X4?6lM^<Uv?U ^<Uv<Ts?U ^<Uv<TsA_U <Uv<Ts1^=Fa8" 8HP58;\V9rvFE:V{ {:VU:%n" 9memVHa bN-'  `Ck-C_-OX Ww-A %I<Uv<TsBN-Dl`Ck-C_-IDWw-AR%I<Uv<TsF `:~*_@:cU|A<U <T <Q <R ?lM`<Uv<Ts?a<U~<T?k &a<U|?ų| Ja<U|<Ts<Q}?г]ha<Uv<T|?<a<U|Ac<U~<T|.Sj0_bC{0C0(C0aC0J0BL0bC]0V´({bC0hC0C0C{0I´(W0;<Us<T|<QvA_<UsS0cC0C 1J13J!1J-1VPVcC 1iC0IPJ1W!1W-1?aB,@c<Ts<Q4AjK<Us? nc<Us? c<Us@J_<Q3^OFd8" 8%n"9mem'7rvFP?d<Us? )d<Uv?`Ad<Us?ǵc_d<U|<Ts?*}d<Uv<TsA+<Us^bIFf8" 8HP*8;\V+rvF:%n"f 9mem ,eCFFP e:V{ ?o=+Re<Us<Tv?ype<U}<T~Ac<U~<T}BN-eCk- C_-F IWw-A%I<Us<T|bc.d  fC|. Cp. ?&lM4f<Us<T|RPTf<Us<T|<Q}dcmf<UUA`<UvS.gC.$ C. C. J.F J. J.]U.@U. VgT.\T.TT.QIW.W.W.W.U. A<U <T <Q <R ? g<U|<T <Qw?5dg<U|<Q7A>K<UvS1 1hC1C1@d<UU<Q0Sc.G[hTp.UT|.TS/GhT/UT/TS:/`ahTG/UTS/TU_/PUk/Q^\[pFйi8"p >:Yq;9rvrFHi  X :*an":75n"e?ec^i<UvA<U u<T <Q <R  i $iS@1jCQ1J]1Ji1 Ut1 F&jJ1@J1ADc<UvIv"CQ1Iv"W]1Wi1Ut1 Iv"W1W1A<U <T <Q <R S1kC1C1eg)J{ @k*" +i;+ent !,%n"^Vo { l8"o  T:Vp { B(z kC(C(bk7P lYkXPWkU'kPJ3kA<<Uv|"A#!<Uv ^gV { `Im8"  :V { [B(ȼ lC(C(Bk)' lYkI)'WkJ'kJ3kOA.<Usv"?!m<Us?!m<Us?!4m<UsA!<Us ^XVF`n8"V r>ivW >nivX;V9rvYF9iZ;:&[I:]\V:]]V:`^@)B1~qnC2C1C1IU2A <Uv<T <Qw?.!n<U<Ts A.!<U^<Fo8" 8VU:Fo:%n"6B2- DoCF2YC:2C.2b29oYF2Y:2Y.2;M<Uv<Ts<Q B-oC6-C*-IJB- ;<Uv<TsGmlM|SS2-ypCd2.Cp2gf-C6-gC*-.XJB-;˿<UU<TT^QBF2Kr8"B 8VCU9rvDF:%En"B-*a:qC6-C*-QI*JB-;8<Uv<T}b1}hqC1C1 Ag<Uv<T|?lMq<Uv?LKq<Us?}Aq<U|<T1?Kq<Us?I!q<U|?_r<Uv<Q1?K1r<UvA A<U|<T1S2 CrC2UW2X0C2X0W2g}28C2A=^!<Us^9<Fps8"  B2GsY2IW2Aq<U|v"B(vsC( C( Aq<Us(S2 7sC2 VEsC2#!AMr<UsG=2^VF`60t8" \!G25GF7t8" !8%n"!A2<UUS 3uC3|"C(3-#J43#U?3  BN- 'uCk-s$C_-$I Ww-A %I<U|VsuT3\h(3IsW43U?3  A<U i<T <Q <R  A0t<U|<Ts=oBF v8"F  %9aobG ;%:VH { &:E2I *&:VJ U&9memK ':%L n"U(:~*M *(?s!~v<Usd%0;v<UU#<TU#G:lM?H 3v<Us<T}A\=+<Us<T}^6a F`)x8"  (8H @x)8  )9rv Fu*:V { *:V U/+9meme+?w<U}<T?k w<Uv?!w<Uv<T|<Q?]w<Us<Tv? x<UvAc<U}<Tv^<1FPQtz8"1 +8&1,8;\2V-82 |-8 3;.8g_3@.9rv4F.:V5{ &/:V6U/:<7Y/:~*8tzb09mem90bN-q`=ZyCk-1C_-1X`Ww-A%I<Us<T}?xy<U<T|?!y<U~<Tv<Q|?y<U<T?k y<Uv?!y<Uv<Q<R~<X|?*]z<Us<Tv?g;z<Uv<T?rcYz<U<TvAc<U<T~S|3e{C3U2C32C33C3r3J33J33J3@4?!z<UvA)x<Us<T|<Q}<Rv<Y1\QDF #{L" c48;\V4f|3 h3C34C345C35XW3W3W3@Czz<QT<R0^UFPo|8" 58&58;\V*6f|3Ph3C3*6C35C35XW3W3W3@gzz<R0S3p$}C3c6C36C46f|3pC347C37C37C38XW3W3W3@zz<QT<RQ5KFwT~8" P88VU887\F$98I9BL0 "}C]0:b3@"6~C4m:C3:C3;f|3C3a;C3;C3;C3,<XW3W3W3@zz<UU<RR;<Us<TT<Qv5X&F 8"& <8V'U<87\(F<8I)6=9rv*Fo=?&}~<UU<TT<QQ<RRA/K<Us^=YF@&8"Y =8VZU@>9rv[F>:%\n"?i6B(C(?C(?B(C(@C(@b4> C,4b@C 4@XJ84@;Y<Us<TvBN- sCk-AC_-'AI Ww-A%I<Us<T|B/ ɀC-/JAC!/mAAx<Us<T|B8(C8AC8AC8AI(W8b0kC0AC0AC0AAj0<Us<Qv<R AK<U|?q-<Us<T|dT~<UU<TTGXI? S<Us<Q0<Rv<X1<Y0?h<UsA'K<U}6 +&^'WF0ƒ8" A8VUB8%n"^C+rvFH҃ BN-J Ck-DY_-IJ Ww-AV%I<Uvb4c0QC,42DC 4DX0J84D;<Uv<T|dT~<UU<TT<Q <R A<U <T <Q <R ҃ ,ƒ^PFy8" ,E8VUUF8%n"kG9rvFGHH B(/zC(HC(HB(RC(iIC(iIBN-y Ck-JC_-=JIy Ww-A%I<Usb4`TC,4JC 4JX`J84`K;<UU<TvB8  C8KC8KC8KI W8b0C0KC0KC0KAj0<Us<Qv<R A&K<Us?n!%<UXdT~L<UU<TT<Q Ai<U <T <Q <R  1^6HFpև8" L8VUL8%n"M9rvF,NBN-"YCk-dNC_-NIWw-A%I<UsB4.2C,4OC 4[OI.J84O;<Us<Tv@-T~<UU<TT5 c;F@R8"; O:8<Z*P:V=UR:%>n"SBN-OCk-SC_-SIWw-A%I<Us?_"<Uv?mlMˆ<Usd<UU<TU#d;<UU<TU#<QXd׃2<UU<TU#@#<UU<TU#^^F08" 7T8VUT9rvFmU:%n"U:\n"U_fY @BN-m2Ck-VC_-EVImWw-At%I<Us<Tvb4`C,4VC 4VXJ84#W;{<Us<T|?XI<Us<T}?-<Us<Tv?lM֊<Us?04 <Uw<Q@<R0?KS%<Us<Q0<Rw<X4<Y0?T~J<Us<T|<Q ?_g<Us<Q8AT~<Us<T|<Q <R  ^uTF 8" YW8VUW9rvF|XB-:%GC6-XC*-XI:%JB-!Y;U<Us<T|G{2?vw<Us<T1<Q|@}<Q <R '^}UF8" DY8VUZ+rvFBN-GCk-ZC_-ZIWw-A%I<Us<T}B-&&C6-[C*-t[I&JB-[;)<Us<Tv?<K<U|dq}<UU<TT<Q @.<UU<Q0)=Z>F+*"> *V?U)UQFl*"Q *VRU+rvSF,%Tn"^Nc|F`8"| \8V}UE]b+ܐCH~^C<)_XJT_J_ `b<._xCW.`CW.`CL.aZN-X qCk-aC_-aIX Ww-Ad%I<UvB-,y؏C6-aC*-aI,JB-b;=<Uv<T|b0j/C0BbC0hbC0b@)j0<UU<QT<R ?-M<Uv<Ts?lMk<Uv<Ts? <Usd}<UU<TT?@B,Ɛ<Uv<Ts<Q4AIK<UsfCcC_cg-NC6-cC*- dIJB-Vd;<Uv<T|^CF`K8" yd8VUe:Ke:%n"e_fY @_A29rvF1fHQ BN- cCk-zfC_-fI Ww-A%I<Us<T}B-%ÒC6-"gC*-EgI%JB-hg;<Us<Tvb/ C-/gC!/gA x<Us<T}?-&<Us<T}??&"><Uw?KE"V<Uw?Yc+t<Us<T}?kK<U}?}<Us<Tv<Q ?-ɓ<Us?<U}?S<Us<Q0<R}<X5<Y0A8<U 4<T <Q <R &^)[XF@_'8"X g8VYUh9rvZFi:%[n"VjH' @b-mPkC6-yjC*-jXPJB-k;<Us<Tvb3eÕC4GkC3skC3kf|3C3kC3lC33lC3VlXW3W3W3@zz<UU<Q1<R B/nC-/lC!/lAx<Usd}3<TT<Q <R p?/Q<Us<Qv?Ki<U|?@1<Us?K<U|?O-<Us<T|?qS<Us<T|<Q0<Rv<X5<Y0A<U 8<T <Q ]<R @i)FFJ*" ^.CF?8" l8VUm9rvFn:%n"nB-$ C6-oC*-goI$JB-p;<Us<Tvb,`C=(pG~Z"?e"Q<U|?{"n<U|<T1@)x<UU<Q2<R0<X0<Y0?-<Us<T|?lMԘ<Us<T|?A<T1d+}<UU<TT<Q ?>d*<UsAHK<U|^ElF8"l tp8Hl@p8HPm"q8Ynq9rvoFq:Vp{ r:VqUrr9memrr?<U|<T?k <Us?"C<Us<T<Q}<R~?]a<Uv<Ts?+y<UsA6c<U|<TsSD4`CU4rCa4lsCm4sCy4itC4tC4}uT4J4uJ4vF rCa4%vCm4^vCy4vC4vC4 wC4BwCU4ywX W4W4@{<UU<T3?"<T}A?<U|<T0<QL<R}5@F2*8" w8n`;wA-D4<UU<TU#<QU#<X0<YT5WF@98" Jx8%n"x8n`;xAtD4<UU<TT#<QT#<YQS4C4yC4yJ4mzJ4yJ5yV?bC4zC4zI?J4{W4W5G"A?<T0?"z<Usd_<Q3@0*<TU<Q0SD50CU52{Ca5{Cm5U|Cy5|W5b5BP$C75k}C+5}C5l~V&Tm5QTy5RTa5STU5VI&U5PA?<Uv<T0dt_<UU<Q3G"S5C5C5W5b5 C75C+5C5V9 T5TC5I9 U5PAK?<Us<T0<Q0d{<UU<T3G5"5UB@ F`l8"@  ځ9rvA F9aobB ; :VC { :E2D *E:VE U:%F n"H| 0B5* C5݅C5&I*J5o;<Us<T|Fe:~*K *B5{z )C5ΆC5I{J5;<Us<T|B5_ C57C5ZIJ5};<Us<T|V.2 :Vf Fb16m C1҇C1AWg<Us<T}A=A<U}<T2GJlM?K2<Uv?=+P<Us<T}AK<UvV7:~* tzA.<Us<Q1B/  C-/>C!/bA'x<UsF0:~* _b11p ?C1C1Ag<Us?mlMW<Us?<U :<T <Q <R 0?KK<Uv?v"ӣ<Us<T1<R|AA<UH<T2?K<Uv?-$<Us<Tv?SW<Us<Tv<Q0<R|<X5<Y0?s!p<Us?<Us<T0?K<Uv?d<Us?@/ۤ<Us<Q|?IK<Uv?Y@1 <Us?lM#<Us?*@<Us<Q0G5AD5<Us<Q0<R1| l)EF¥*,>+6-iv¥-niv;-memȥP ^`FSd8" S8H@z>iv¥>niv;:V{ :VU{: /9i;9rvFN9mem:'%|:'G@vHt b\CCbCLC?<U<TH?l#?<U<Tv<QAc<U<Tsb5C6.C6wXJ 6?P?#<U<T0?gӧ<U<T?k <Us?Z#<Us<T|<Q<R?]:<U}<Ts??#X<U<Tv?_x<U<T?}#<U<Ts<Q?k <U?Z#<U<Q<Rv?]<U}<T?K<U|?/:0<Ts??TN<U~<Ts?Jcl<Us<T~?K<U {?c<Us<T?cũ<Us<T?<U к<T <Q <R ? E<U к<T <Q <R A/c<U<Tt d^\FP8" 8VU8tMFט9rvF9i;j9memǚ:V%b- XC6->C*-tX JB-;<U}<TFPj:t b16, ԫCN6)CB6`XUZ6A <U}<T <Q?K<U~?{#<U?{}+<U}<T<Q ?KC<U~A}<U}<T<Q <R0?Im<U}?:<Us<T}?2<U}?ͥ<U}<T1<Q0<R0?K<Us?}"<U}<T<Q <R0?x}G<U}<T<Q ?}m<Q <R h?K<UvA}<U}<T<Qv<R05XJyF8"y 8ez J8^R{;8e|:%}n"Z_V~ 7iv ~7niv;~9rvF_fY 9memq?v#<Uw<T~<QT<R|<X}?#ڮ<Uv<T|<Q4<R0<X0?y<Us<Tv<Q1?c<U}?#2<Us<T0?!cJ<U}?2b<U|?XS<Us<T1<Q0<R|<X1?sA<T2AA<T1.tQ *"  *% n".P.M*". *%/n"+pq0 B,J1V+inc2F,X#3a+rv4F/MP ^[SFY8" 8*8CK;X8VUR8~**8%n"&9rvF_HV:H:H9buf*j:_;ߨH bl)]2C})dC})dC)C)b0Cӯ,Cǯb ( CCXJPJJҫJ( J4@U? ?S$0<U}?hN<U}<T|?xl<U}<T|?<U <T <Q F<R A9<U D<T <Q 8<R A$$<U|R]<UR:<U<Rv<X<Y}?.:<U<Ts<Q.#v##v#,(?K<Uv?6$<Ts?Wس<U~<Ts?W<U :<T <Q c<R ?L$<<U<T# ?|<U <T <Q <R ?<U `<T <Q R<R A<U @<T <Q I<R l)RP F*"  *V { +rv F,V U+mem /RPju,G# ;,%$ n"j,~*j _,>Uk ;j,%q n"2,% n"jѵ,% n",>U ;2,~*5 2,Z K )T>{FK*"{ *%|n"+rv}F/KT>ƒ)LJF*"J *%Kn"+rvLF/L)@Fٶ*" *%n"+rvF/ٶ@.)Z?F *" *%n"+rvF/ Z?70)9EF[*" *HP,%n")NF*" *HP,%n")W6FǷ*"6 *HP7,%8n"5Z @Z8"  c8SU <8I Ft9rv F9aob ;:E2 *9mem *H F:V { 'bw CCXJ'J2J>UJ PFJҵԶb+@ C+C+C+XXJ,J ,J,J#,ʹU/, PRz<U<Qv<R|?.6$<T|?bҹ<U X<T <Q <R PA<U ,<T <Q <R Pb63N FC6A2<Ub[E Cx7ClmXJ?2<UAlM<U<TvFPMJߵٺb([ 0CC XJV?2<UAlM<U<TvAg$<U<T|?e<U :<T <Q g <R P?2<U?~$Ż<U<T|A3$<U<T|FJyWĵb60 JC6C6 C6DC6hA3$<U~b޶` CyCX`JU ?0t<U<TvA<U i<T <Q <R ?lM<U?P$+<U<T|<Q~?f-LI<U<T|A<U <T <Q  <R Pb%) {CBCC6yXJN½b-GC-C-C-ZN-xCk-+C_-NIWw-A%I<U?2_<UAlM<U<TvF@JzqWF"JGbR30 ߾Yo3Cc3ɿA2<U?S<U<Q0<R|<X0A$<Uv<T|B6  yC6C66C6ZC6~A$<UF`!Jb  ׿C&\CXJ2W=G0tbP$ CmCa[XJyU BN-AUxCk-C_-6IAWw-AQ%I<U?)0t<U<Tv?0t<U<T0A)<U i<T <Q Q<R bb@ CCX@JU˶ BN-@ Ck-ZC_-}I@ Ww-AL%I<U?m0t<U<Tv?0t<U<TvA<U i<T <Q <R AlM<U?@%I<U<T|<Q?V-Lg<U<T|A<U <T <Q <R PF6W\JhBg6:: 2C6Cx6I:W6gl).fY})Y})Y)C)B+.B C+,C+PC+sA;$%<Uv<T4b+D@ Q C+C+C+F C+C+8C+nA*<U<TvAU$%<Uv<T8B/_ 1 RC-/C!/Alx<U?lMj<U? 3<U<Tv?h0;<Uw<Ts?=+<U<Tv?_<U<Q2?K<U~?=+<U? 3/<U<T0?"o<U i<T <Q 9 <R P?R<U<T<R|<X|<Yv?=+<U<Tv?<U <T <Q ) <R PA<U <T <R P?;%V<U<T|?R%v<U<T|?m%<U<T|?<U :<T <Q 2 <R P?2<U?%<U<T|?2&<U?%F<U<T|? 2^<U? %~<U<T|?<U <T <Q <R PAH<U <T <Q  <R PF &:V UB$71" uCA7C57!I1JM7W;7<U<T|F :%H( :;\) VVJ 7rv2F FVARd<U;<U<T|<Q?TK<UvAK<UF !:%H _:;\ V9rv2 FkB7t Y7F!:V UR<U<T|<Q~?y<U|<TsAc<Us<T|?y<U|<Ts?c/<Us<T|?0;N<Uw<Ts?Kf<Uv?K~<U~?d<UA{<U<T2A8l<UF! :@ ;:9buf *]A0;<Uw<TsF!,@e ;9buff *?G<U?+u_<U?cKw<UvA<U к<T <Q t <R F":% n":V U,va Fb)p" `C)C)C)!Xp"J)J)J)(J)J*e;<U?rlMx<U?K<U~?<U? u<U?uK<U z?;=+<U<T|?K_<U<Q2?TK,<Uv?JKD<U|A<U к<T <Q <R ?_@1<UAhK<Uv  !^_ 8"  8SU 9rv F99len H ?Ƿa<Us<TT<Q1?y<Us?K<UsA'<U к<T <Q <R l^O 028"  8SU =@5<UU<TTk: F@8"  v_T X:@ :PV m:E2 *?Ƿ<Us<T|<Q0;<Us<Qv<R0^^E$Q8" '8HP`:%n"AlM<UU<TT^=F 8" 8HP8e1:%n":VU:V{ cH BN-QFCk-C_-IQWw-A_%I<Uv<Ts?1lMd<Uv<TsA<U <T <Q <R i^^F\v8" 8HP9rvF:%n"?lM&<Uv<TT?%><Us?B,a<Uv<Ts<Q8AK<Us^S;@6" U^>Q`.8" K8HP:%n"AilM<UU<TT^S  8"  8HP R:% n"AlM<UU<TT^2N08" 8HP:%n"3:t`iAlM<UU<TT^?(56"( U^ET-f6"- U^M1 6"1 U^Q5 .8"5 8HP6:%7n"/A)lM<UU<TT^@CP76"C U^T;GV`8"G >idHH @A<U :<T <Q \<R @70^:``V ^8"` >ida6H^ A<U :<T <Q u<R 1^]Fd~8" o8e 8^R;08ei9rvF:%n"H ?$<Uv<TT<QQ<RR? lMA<Uv<T1AD<U i<T <Q <R  ~^WFPg8" 48e 8^R;8KAF.8e9rvF:%n"qH ?bd<Uv<TT<QQ<RX?}lM<Uv<T1A<U i<T <Q <R  ^.LF&B8" 8HP:%n"AlM<UU<TT^E] F$8"  O8HP :% n"AlM<UU<TTSY7 Cj7Cv7C7J7W7Vp,C7Cv7Cj7JIp,J7J7?{lMf<Uv<T|?*<Uv<Q~AK<Uv?O<Uv<T~AYK<U})=F:*" +rvF,%n",8Z*,HP,I,;\VDL)AF}*" ,8Z*,VU/}A.)UF*" ,8Z*,VU)VF*" ,8Z*,VU)UF$*" ,8Z*,V U)VFZ*" ,8Z*,VU);&F*"& ,8'Z*,V(U)\*8Z**+0;*L;,r;2,x;)sPuF *"u *Vv-nvw +rvxF&)9V^Fk*"^ *V_-nv` +rvaF)DF*" +rvF,VU,% n"/Dj,XVn"2,HP570)OF,*" *VU*%n"+rvF/,O70.T<rl*8rZ*+ivsP ,@t +iu;)SnF*"n ,8oZ*,VpU+iq;,UrP /S.)>0F*"0 ,81Z*,V2U)AqF5*"q +rvrF,\sU)u<0Fv*"0 +rv1F,82Z*,V3U)aLF*" +rvF,8Z*,VU,+)FF*" ,8Z*,VU)&KFF*" ,8Z*,VU+mem+rvF^F\)8" >in 8;: i: :8Z*v:L;:x9rvFf:bF_*I:%n":TW;X9memH дb("hC X"J,J"hJ.J:BS2V.#0Cp2:Cd2_g-V.C6-:C*-_IV.JB-;w<U}<T~?L%R<U~<R~A/ K<Usb5F#hCFX#WRJ]Ji@bvF`#5CX`#JJJU;u<U}<T~<Q~B-.?sC6-C*-I.JB- ;<U}<T~?K<U0A'K<Usb3#6HC4CC3C3f|3 $C3C3AC3yC3X $W3W3W3A-zz<U}<Q1<R F`$:NDFb,%HC,5C,5C,C,uX%J,A&<QsB7,+#C7C7#I,J7F;<U}<T~b,%cC,iC,A$&<U}b,U%OC-C-C,X@&Y-Y-C,f,0&p&C,+C,A>&$&<U}b3m&QC4OC3C3f|3m&C3C3MC3C3X&W3W3W3A-/zz<U}<Q1<R b,"'C,C,A;$&<U}b,U@'C-;C-;C,;B3mCC4C3C3f|3mp'C3C3,C3PC3sXp'W3W3W3Azz<U}<Q1<R b,'gC,C,A$&<U}b'nCX'WJJ0J JJ% l1 b3 p(MC4C3C3f|3 (C38C3nC3C3X(W3W3W3Aa&zz<U}<Q~BN-  :UCk- C_-Y I  Ww-A %I<U}<TvB/5/ +C-/ C!/ A?/x<U}<Tv?-<U}<Tv?>K<UsAs lM<U}<TvB3r9C4 C3 C38 f|3r(C3[ C3 C3 C3 X(W3W3W3Azz<U}<Q1<R B*C* C* b, )}dC-_ C-_ C,_ Ix+Y-Y-C, g,x+C, C, A+$&<U}B3 6C4 C3' C3K f|3 P)C3n C3 C3 C3 XP)W3W3W3A(!zz<U}<Q1<R Xb,o!)PC,C,)A!$&<U}b,&)C,OC,sA&$&<U}b,')FC,C,A'$&<U}B7',2C7C7I',J7+;='<U}<T~F*y:@# Nb,'@*@C,qC,A'$&<U}B3.9+7C4C3C3 f|3.p*C3.C3ZC3~C3Xp*W3W3W3A.zz<U}<Q;<R A'<U~<T'v4--@-%42%#3$B3I(9Z%C4C3C3f|3I(*C37C3cC3C3X*W3W3W3Az(zz<U}<Q6<R λb,**eC,C,A*$&<U}B3v/0C4C3BC3ff|3v/+C3C3C3C3X+W3W3W3A/zz<U}<Q1<R ?K)<Us?5&C<U~?K[<Uv? Ks<UsGY!K&?Q'K<Us?/<U~<TvA!0<U}b%*(0+C6*CM*CB*b%*p+s6C6*PCM*CB*b%*+jC6*CM*oCB*b%*K +C6*CM*CB*BB CeI JJ(? yp<U}<T~A K<U|b, ,g|C,C,C,6C,X,J,A &<Qsb7 P,C7XP,J7Xb3 ,UC4C3C3Kf|3 ,C3C3C3C37X,W3W3W3A-zz<U}<Q1<R Tb, ,1C,mC,mC,C,#X,J,YAM &<Qsb%* 0-C6*CM*CB*&b,@ p-IC,oC,oC,EC,QXp-J,As &<QvB, &C,B C,f A $&<U}b8 -C8 A {<U}<T6b%* -C6* CM* CB*!F .,L=:r>;$!:^k?FG!b%* /HeC6*#CM*5%CB*'b /MC)C"+Ck+X/J-V J-A `&<U~F00:>[;-b81_CU9/CI90C=91C29~2C&93C94C95X1Ja9 7Jm97Ux9U9J98J9E9J9O:b)*1aY,)YB)YB)C7)l;b+ 29CT;CH <C<\<X 2J_<R<U}<T~;<U}<T~F`2J9=bF"2C L=C=C=X2J6>R"<U}<T~;)<U}<T~?"D<U}<T <Q (A"K<Us?lM<U}?{&Z<U~<T~<Q~<R~<X|<Y~?Kr<Us?&<U}<T~<Q~<R~<X~?_<U}<Q9?K<Us?{<U}<T9?K<U|?&/<U~?M lMG<U}?+Ds<U}<T <Q ?+K<Us?#,j0<U}<Q~<R A-,K<U|?gK<Us?:_<U}<Q2ACK<UsB,!VC,>C,>A!$&<U}bk$2\C|>X2J?J@JfAU B-g%,MC6-BC*-vBIg%,JB-B;%<U}<T~b%`3VFCBC>CCCX`3JCU `b1&3C1DC1EDAo/g<U}<Ts?&A<Us<T1? &K<Uv?E0c+<U}<Ts?V0K<UvA}0<U к<T <Q <R `V,%J{D?,lM|<U}A,&<T~F3JD?-j0<U}<Q~<R ? -K<U|A=-A<Us<T1?$lM<U}?Q%&6<Us<T~?%KN<Uv?J- 'f<Us?-<U 3<T <Q '<R ?[.<U :<T <Q .<R ?/'<Us<T~?/I!<UsA/<U <T <Q <R ? `&v<U~?;<U}A%K<Uvb, 48C,DC,DC,EC,LGX 4J,GA&<Qsb,(`4#cC,HC,HC,HC,?IX`4J,uIAV&<Qsb%*4MC6*ICM*BJCB*Kb"84UCK89KC?8\KC38KX4JW8KJb8)LJn8)L;<U}<T~F 5:LLb5CLC_MCMX5JNV}JINA`&<U~?E5<U}<Tv?NK<Us?D5<U}<T~<Qv?K<Us?Y7(<U}<Qvs?K@<U|R\c<U}<Rv<XsGnK?8'<U~<Ts?<U}<Ts?K<Us?I_<U}<Q1ARK<UsF5: ;NBZ"+CkNI"JwNJO?R'q<U~A`<U}<T~Gn'?"*<U~AH*<U}b6hC)OX6JLOJrOG3n'?L')<Us?\L<U}<T0<Q0Agn<U}<TsB$#C5OI#JAOJMO?'<U~Al<U}<T~b @6{CPX@6J(PJNP?':<U~?]<U}<T0<Q0A<U}<T~Fp6:[;sP?(<U~<TsA(<U}<QsBR!PCPIR!J PJ Q?f'2<U~Aq<U}<T~B$C0QI$JSQJyQ?'<U~AJ<U}<T~b76C7QX6J7QB35;C4%RC3QRC3uRf|356C3RC3RC3RC3 SX6W3W3W3Afzz<U}<Q1<R B:$2CK.SI$JWQSJcwSWo? (<U~AV<U}<T~b7(7ZC7SC7SX7J7S;R<U}<T~bl07VC}TX07JcTJTJ/UJzUU @? <U D<T <Q <R @?"(5<UsAA"y<U}<Ts<Q0b1%#p7C>UXp7UJJU:VJa]VA6#:(<U~bE$7 CVX7JVJV?Y$P( <U~Ad$R<U}<T~B3(9D C4WC3BWC3fWf|3(7C3WC3WC3WC3WX7W3W3W3AA(zz<U}<Q1<R Xb7S) 8H C7XX 8J7qXB3q)?K C4XC3XC3Yf|3q)P8C3BYC3nYC3YC3YXP8W3W3W3A)zz<U}<Q1<R b,)8 C,YC,YA*$&<U}b,,8[( C,"ZC,EZA,$&<U}B,-_l C,kZC,ZA-$&<U}?@1 <U?K <Us? 2 <U?D <U}<T <Q ?K <Uv?8 <U <T <Q <R д?* ;P <U}?? lMh <U}? K <Uv? 5 <U}<Ts? K <Uv?E Y7 <U}<Qs?O K <U|?v lM <U}? D5" <U}<Qs? K: <Us? KR <Uv?r 5&l <U~?>  <U <T <Q <R д? K <Us? <U <T <Q <R д? ;<U}?Hg(J<U s<T<Qv?v;b<U}?Kz<Us?/K<U0?K<U~?K<Us?K<Us?և<U}?K <Us?K!<Us?&9<Qs?5W<U}<Tv?Ko<Us?&<Qs?&<Qs?fK<Us?#<U}<Tv?#K<Us?m$K<UsGP)K&?.R<U <T <Q <R дA/<U <T <Q <R дl^^0 8" Z>in Z8;'[@0F<UU<TT<QQkrHF0$W8" `[7bufW~Hh  X8,Lb{80 9m8@C8!\C8\X 9J8];0<Uv<Tw<Q @<R0I0=:>:^?0F<Uv<Tw<QsA1<U j<T <Q <R  @hn?D^K/ F1%8"/  ]^8t`/ ;^9rv0 F^?1<UU<TTA1K<Us^F? F1f8"?  _8HP? d_8t`@ ;_9rvA F8`:%B n"n`?2lM<Us<TT?&2*<Us<QvA/2K<Us^S[ F`246"[  U6C\ T^uCn V2&6"n  U^*Pr 2W6"r  U^[v n"28"v  `8HPw `g/2| C-/aC!/f8I =f8I FTg,% n"_A 2Pb/49 C-/gC!/hA4x<Us<TT?4E""<UPA4c+<Us<TvC2^a!F5g8"! Oh8A!h8HP!xi,%!n"B//5!C-/jC!/"  @ tapF" s]%6F" n" tG $F#  @ ##sD ?# ¥ ; st qFZ# ¥ ;r{# k @ ;s<F#  ;t F# # 9 ;  qW# - ; @ @ s<;nF$  @ ¥ ;tb;$$ Br+26$ n"qhOL$ Y jseFg$ * ;r~$ * r3]$ * sF$ * sa;$  6 ;tF$ *  q`^% n" UtF$% *  r7;% n" @rMR% * s(Fm% * r% * qq% * Nqu% * 6tF% * ks+F% n"sF&  ; tzxY$& Y 9 ;qq5& *q@QK& - t_;`& @sd8;{& U ;sx\ h&  & ; FtKI2F&  n" U & FsyJSF& t>:F ' n" Ut_AF' n"tBHF8' n" UtD@VFR' n" ;r n'  Y ;tf>K' rd'  ; Y ;r S'  r 2'  Y ;r,'  q5 ( N q( 6 q:( k ;qP( rg(  tjAF( 9 9 ;qOa!(( YsBt;( s:;( wT2  @I-.c:c@: 47int<7q7 e29 mu^;5e2;  90B1I3P574e P"G " y "Ϭ . S%  ,  Y( 0 L*ߪ!Haobn 8   <#:8 1( mem es0 /8 "@ g1H $P 5*!X F ` j" E8) K4) <5 ) 70) !) 8) 7) , ) y#) x&) z() 0y+) O2.) C0  +4  76 >P: /=  Z8? &A QD g\H FFL |&O JdT r,W h;Y!$ X[!D 1] d +` h >"c l *fp Z5iq U0lr Yzns %pt  "su 2wv 2~ w .||T|||B|B||||||{[{{[{K{{5{{7{{{{ {h{m{{{{'{{g{{{{Ixxxxxx(" %s && 7(len*)ref, (:OG ToX)_\)H` Aah \ *7^   ' Fc  ?L0  _P  I   DmQH)HPLP HT ]Y Z?bfdf;ptrjsz!k9   )   s< ) &1S   )   s#w!'9+.,S6!:9> )?GhdHxM)LNY ;3p }A HP!{ @ hdx)fA nva ()0cat 8OM   hdfA j  hd;\   8 E    s hdniv)ivs 8 ND 0 hdx )nva )  (], % hd)-  lW. 05~ hd9&=;\A E I) ]N(}O' V hdZY^]c d k hdo+wsx @ hdT  r  Vy  _ ~   ext N $    ) ; s &  1  ) ; s$)'  ;=  = )  s #LO U x   ) ; so9l  1   ) ; s   ;  s    ;  ; s.%;M  ) s9 R* " 9!9};   s'~ );  ) ) sB-;+  + + s/a24)PU[y  ) s 2i1  ) s 1   s61'   sZ!39;R  R sX5io;  R ) s7 ;   R ss9-    ) s7P 12   ) sB3n >D;b  ) s0 nt;  ; ) s1 1 % $ , & 3  &# :C  w9 Ax  F  K ( . P0 9 TM8 Z* XY@ " ]eH A! aqP ( fX ) k` J- lh / r1p i2 s=x ) zI 2 y 1  6  b! ' ,)  9  7  %7  5 ] J3 2 0 b# s& ) s| 28H s s|& TZss ) ) s. s s ) s(W \ s+` d &h Hl s m  3) .)c )G  ?nov)ov#c$oRHPV [._)^` X :ctx ݢmap @ A )@  )H  P4#F4# .ctx  / @ 2 'H " 'p - + u+ + * + % + 20 ) ( ) 6 )  ) $ ) 8  - Fj , ( %:%  *obq  -9 0 (9 8 1 @ 2 H 1 Pseq X / ` 0 h 8 p 35 x v/  Z/  e s V  g+ ) HP Q g\ ů FF ɯ |& ̯ Jd Я ! ү P#  @& ֯ - ׼ * ٤ ,  H 8 2 2 A 3 W, ' ,x (; `( 04 'E  )L o * key + T ,sE - / .v 0mem 1 t` 2)  3  4 L 5W9 ;u"<t%(%' (end+pos. 1 Y3 ^4|=0b 75bbuf'2@ /bcurbmem / ) ) )( v)0 )8h wP /nv hcnv O 75 s@seq H o L yh  |+ + r  H < /  >  ^ )  )len )s y ?7#!8  F`45o82'B$ 3A $4G1 , 8 2 9 @ â i Ÿmem Ǧ  )( I )0 1 8bad <m Q   .v sl ڭ! I"FJ3"K"L^-M *4 ! + 9 ,s! )V#$v1 .w$v2 /( <dpw = e >s ;\ A  6 D$# EV Hdpw L H Teof Y 7 ]8 ^ `D%bX l H n0 o r. 7 u0 v!( yn"T z"  {" |$ext }.v* ~90 0  V f- @ ~* n` 2  s0  2 y  /  " n ) &* (')((*xq,xmem. mQ0) 3) |5 ~*65 1)e&2x-!+.U" C.p# "  E$ !K&val( $+p#,H66 &$:,(MPOn VP E2Q -R6H7SAv,"<9!(;6/'?)( / ;. 2 / Y34$S'5-y  V f-@ivs ` +'h 7' 7niv) -) +0) x) - *  lr' ! ]  *  x  .-    #  b5  ]0 # T!]bZ2IK;W'Ƅ! 75DŽ!ivs niv)T!'T!(ݪ! H#ބ!!l!%d(!&dpw(!'H)!(Le.;4")".)HP.)f/4"*O"Le:"A O"l?"%d"+f4"&dpw!'H(\dCB#)"C)HC)HPD)fE4")fF )F),dpwG!)eHs-rvI;.fJ.VK.VL= .fM -memN//e0hfp5_&1"uj1H{k1HPk1f4"=l2nva_&l1)'m3dpw!4es5rv;m6f 6eA 5memm7"59&8"sn8"n8"o8"o8"o8"bp8"p8"(q99:"q:"ar:#r:#-s:#s:(#s;3#7;:#6<5D$=Us=T< 6D$=U7AE=U=Ts<5XE&=U~<5oEJ&=U=T=Q}=Rs>%7E=U~e&O? f0;@7fI'@"0`t@HP0tAnva1_&Du@1)uAdpw2!v'H3B!S70:='8!bv90::!v>7B#=QT=R0=XQ=wX=w0C!@W 'D"E""E""F&" p>`WE=U =T =Q0=R p?d7M)@"v@f4"lwAnva_&w@):xAdpw!x@esyGHTHrv;BT"7`: (8q"y8e"y9`::}"yI!K8(8"Gz8"jz8"zJK8F&" p<7E)=Us>,8B#=U|=Q =Rs=X}=Y~=wv=wKd;8>)1"z1HPz2nva_&]{1){>8B#=UU=T1=QT=R0=XQ=YR=w0=w0Kd8+1"|1H|1HP}1f4"}2nva_&~1)~4es-rv;7!K9:*8"?8"u8"9:F&" p<9E*=Us>49B#=U|=T}=Qv=Rs=w0=wKc;9+1"1H1 lL9E=UU=QQKPf;9,1"1H-1HPޯ1f4"*5rv;MVMV= W6eA @5mem<9XE?,=Uw<:D],=U}=T<:Du,=Us<$:F,=Us=T|=Qw[:+E=U}=TsNd;:p-@"4@H@HP@;\ L:6F=UU=TQ=QRNc;:(.@"d@H@&օ@;\ "@ n@ )L:VF=Y0Nrd);:Fd.@")L';VF=T =Q0=R0=X0=Y2N<;5;@;.@"5R@H5Aiv6.ćAniv6)LG;F=UU=T0=QQ=RR.8 N4f;P;j1@";6@H;@HP<#Anva<_&ԉ@=)7@{e>sOV?pOV@= GfA OfB;O CsPrvD;PmemE@<;F0=Us=T|<;D&0=U}=T<;D>0=Uv<;oEk0=U=T=Q~=R}<<F0=Uv=T4=Q|=R=Y~<<D0=Us=Tvo<+E=U}=TvNf|;< K2@"|@H|\@HP}@Y~FPrv;O%)<< G1=Us=Tv<=(G1=U|=T|=Q|=R\=LG=Us=T0=QvNf;=63@"@HK@HP@OGY\O%^Prv;<>qG3=Us=Ts=Qs=R\<8>LG*3=Us=T0=Q0 GB3=Tv<>qGo3=U|=T|=Q|=R\<>LG3=Us=T0=Qv<>G3=Us=T0Q>(G>>G=Us=T|=Q0=R1Nd;?j6@"@HĔ@HP&@ @)^@  R.)PmemPbufPpoOeOeSOVOV= OFj6.Prv;gS#fE@@[BE=U =T =Q x=R P8c8l8N'g;`B=:@"@H@HP@  @.)IPmemPbufoPpޣOVOV= ]O:Prv;S#fCCC'=Us=Tv=Q|=R}=Y;wN4eCL<@"@f4"Anva_&>@)@`(<֧@e sUdpw!<DH<=U=TX>1D'=Us=Tv=Q|=R}=Y<NceB;@D>=@"BG@HPBAnvaC_&ߨ@C)+@`(D;wUdpwE<`DH`==Uw=TX>sDj&=Us=Tv=Q|=R}NeK;D>O>@"K@HPKAnvaL_&H@L)@`(M<UdpwN=Uw=TX>Dj&=Us=Tv=Q|=R}NGT;D?@"T@HT@HPUǫAdpwV!&PrvW;OVXOVY= O~*Z?:Oe[`Pmem\^E+E=U}=TsNg};EZ@@"}@H}Z@HP~@`(;1Udpw@T@ 0@=Us=Tv=Q|>EE=U =T =Q =R 0@l@Nc;EZA@"@H@HPj@`(<߰Udpw@TA <FHA=Uw=TR<FO>A=Us=Tv=Q|>:FE=U =T =Q =R AlANf1@FqBAbufA@7)ܱAiv.dAniv)fG+E=U|=TsV 'sD  )W: D X<D D  4" ) Y'M;E  X+E D W(AE  sXiXE WOa(iE iEA Y_\;E E _& )  X~E iEWDE P Ye;E 4"Y6a;F  XF F 4" X6F FY=;VF  Y<;F   ) Y`;F  . )YUC;F  XF F ) XM G F Y'cM(G  VcW;LG YE;qG  V9dg;G Y Z;G  )Y[;G   ) ;VzxG  )XH H  )  ) X  ! i "len)A$iT z O!4z"src"len)1O UUTTQs gP@O&;\U;'h7 I ;$_g[4  $whO  [d ;$hz T $h_ T $h T (D )P)P)i)P*)));&C&.iPPI: 87int<7q2w2 Pi?PPO outO8 Ai`p inU T key iT i T{ P U T} QU[FF$i.?Qj7 out.7 Ai.` in/U] /T(Q Us Tv Q| R} X  Y3 PQ Us Tv Q| R} X  Y9`Hi;?pQj out;O Ai;`A in os? p Vl l -rwjPnvcnvI75@seqHoLy|l lrH< _A  (cnvIPrxo|vt  > ^--len-L   ?7 # !8  `4 5 o8 2' B$ 3 A  $ 4 G1 , 8 2 9 ? Yo t p@Ð iŋ mem -(I-018bad<m? ر .vٱ  ڛ  M H ?  . #  ( 0 l 8 \ @ @ H  P  X O  `   h  ?p E ?t z px M M  [   k  ~ &{  /  0  1  2  3- q 5? c 7   65 +   ?T   M    ( ll?u o nv hi- IRt-A xA  r-q o- _-t0? 0 nv1 r1g!ji ?#i inja!k ?# k`( `(idxa-">k >.!kj ("jk p q?"ps-n- n-k-len-#fjp?$s1p$s2p$np-rr?AaAb Gv?raAb  v nv r s?res i?entA i ] xA nv r q?map] ores entc%ro?% s? i_*m3? 3nv3 q4?rv5?_r ?/  idx -nv  q ?rv ?%k u%s -sb/%`t-?l ?# bufina alen-5&pent!oAmapA]entAdstB !rmap]ent%Q  ! u5 s5nv5! lUmap]'.=?  Uy-memrv?!Dr xA '=t xA idx-"=t(entnv&uS/  jt$map$] ro$nv% r% o& s&?p'res(rQ? Q( Q-memR%t`S-l{P ?#{ i|in|a }a n}- q~-rvout)o+-Qk*buf+u%*n+-+n+- ,k,-D--uU)jUPRT.resUUU/uUT.finUQ+HV+$V-*inWaS+Wa/nX-0kY 1$1,nZ-i[aY1`;,addp-)r?S++PS-#rv?2kuo%s-0sb/P3S;[451;678TPx9Uw9Q5:%T`9Uv9Tw9Q|;rx@T= ,<xa9Ts9Q@=Uj555.:U#`9U 9Ts9Q?=U5Z5~5:U#`9U 9Ts9Q?=V&555@:V#`9U 9Ts9Q>=55+5d:W#`9U ?9Ts9Q:>WX55=5v:W#`9U n9Ts9Q2>$Xɵ555:8X#`9U %9Ts9Q5=jX5+5O5:~X#`9U 9Ts9Q7=X5q555:X#`9U 59Ts9Q9>X5=5a5:X#`9U 9Ts9Q6>X+555#: Y#`9U 9Ts9Q6>Y5O5s5:.Y#`9U 9Ts9Q6>;Y5555:OY#`9U 9Ts9Q6>\YB5a55:pY#`9U 9Ts9Q6>Y555G:Y#`9U 9Ts9Q6>Y5s55:Y#`9U 9Ts9Q6=YdZ 55 5Y:Y#`9U 9Ts9Q<=Y_ 555:Y#`9U |9Ts9Q<=ZZ!5525k:Z#`9U o9Ts9Q<=$ZUt!555:8Z#`9U b9Ts9Q<=EZn!5 5D5}:YZ#`9U 9Ts9Q<=fZi0"555:zZ#`9U 9Ts9Q<>Z"525V5:Z#`9U 9Ts9Q3>Z"555:Z#`9U 9Ts9Q3>ZG#5D5h5:Z#`9U 9Ts9Q3>Z#555*:Z#`9U 9Ts9Q3> [$5V5z5:[#`9U 9Ts9Q3>,[^$555<:@[#`9U 9Ts9Q3=`[$5h55:t[#`9U a9Ts9QB=[G%555N:[#`9U J9Ts9Q;=[wx%5z55:[#`9U 9Ts9Q=>[%55'5`:[#`9U 9Ts9Q2=\3&555:\#`9U -9Ts9Q@=(\&5595r:<\#`9U 9Ts9Q>=X\&555:l\#`9U 9Ts9Q7=\#M'5'5K5:\#`9U 9Ts9Q9=\&'555 :\#`9U !9Ts9Q9=\ (595]5:\#`9U  9Ts9Q?=\g(555:]#`9U 9Ts9Q?=](5K5o5:,]#`9U 9Ts9Q?>@]")5551:T]#`9U 9Ts9Q5>c])5]55:w]#`9U 9Ts9Q5>])55 5C:]#`9U 9Ts9Q5>]9*5o55:]#`9U 9Ts9Q4>]*555U:]#`9U 9Ts9Q4=]0*555: ^#`9U +9Ts9Q9=^ R+5 5.5g:.^#`9U 9Ts9Q7=;^+555:O^#`9U 9Ts9Q7?\^+4 5@ #:p^#`9U #9Ts9Q9)p?^7<.+U*stra*len-e,rv?0sb/2ku6%s-2 n-2t?AL. &3^; -45t1;678^B`)-9U}9Tv8_PL-9Uw9Ts9Q78$_`p-9U|9Tw9Q8;_`-9U|9T}9Qs8^_P-9Uw9Ts9Q78l_`-9U|9Tw9Q8~_]`-9U|9T}9Qv:_}`9U 9T 9Q 9R &L. <.)o_Y.+?# i*buf*ina+aO2L,fin?8_`.9U|:_`9U|B `6/545mC 1 <551 <C :V`}`9U 9T 9Q b9R )u$ ``aS0+x$A A*idx%-Ac0 8` 09TT=:`}`9U 9T 9Q &9R c0S0Dk`{X1+(C*mem,i-EP<B1,ent3`< 15F a`Fa`8` '19U|9Ts:a`9U}9TvGj )rM? e;+xMA *nvN5w*mapN]+oOrvP?2rQ%rR-,memS)3G Le=V85d 5X E >9,idx[-,ent\G=G e_85d 5X =Ced?95PIeC\ p3eP>fy955D1P>7z=e i95Fe`Ff`8e 99U}9T~:f`9Uw9T3D7lf>z:5m725a75U71>Jy7N7lf>5757=57s1>777777A8f8a:9Uw8f :9U}9T~:f`9Uw=Sg;55ISg7=g}Y;5}Fg`Fg`8Qf8ax;9Uw9TP8lf6;9U9T:g`9Uw9T)u?gw<+?# +s50nv0rv?P=hE<5)`5Fh:h79Us9Tw9Q09R0Bh<5Fh`Mh`p?< xA memrv?BUhl=5f5rQ5~J3<h0?=5<5<"10?J<Nh?H551?7:h8a9UQ9Ts3$1?5~y5r5f1?JN;h0@5H!O}l? j e>+ *memG-jU9UU9T 9QTOgX?0j'x?+?# *mem}rv?PIk3<1j@I?5<5< 1@J<N6jAH5t 5 1A7 !:uj8a9Tv3$8jRab?9Us:jRa9UsB`k ?5"W!?`k 5W!Gikh09UULKpkW@+?# !3 tk`AG@5 !5 !Fk`Fk`3kA ~@5!Gkh09UUFk`Fk`O<?kB A+ ;"+k-t"2 k-": l19UU9TU#@O]? lVgA+?# "+k-0#:dl19UU9T0BliB5#5$C PKl#A7$7$KlPB5%5%IlC P: m}`9U 9T 9Q 9R P:l 9TQ=)w?mXC+?# 1&+s5&0nv@,rv?&=qm1B5)%'5J'8.mC9Uw9TsF\m&a8m7JC9Us9T@9Q09R0Fm`u??C ? ?nv@ rvA?resB idxC%qD?%rEmemF%oG(%D vm?FD idx-rv?%s-sb/%kuO?mJ+ m'++(*nv (+-_),i-),rv?r*Po3XC9nAPJ5C +5uC+5iCR,1A7C,7CV-7C-7C-7Ca.7C}/7C0E0BFFCC8\oE9U~9T~9Q}8no&aE9U~8ocaE9U~#9R~Fo`8Hp7E9U~9T~9Q~9RvFTp`F^p`:sca9U~9T~9Q~9R~3nB`hH505 (1515-5'2521BJ,J87D37P;43/nC H5{;45o(15c'25X25L45@11C7'575=Lo7G5]6HgHg? o 5<65_656Fo#`?o(.5,6H6H6?o56575&7:o#`9T~9Q~NrRq`CHH5J7571CJ777)8Fq#`=q p^^HH H H 5 y8NG pC75d 85X 83CqDiI5 D85C\91D7D9J"DC.D79D93q@DVI595?:1@D7:7:8:rPsI9U9Q7:Jr`9U~9T9Qs3 `rDPIH H 1D7 ;7 ;8wnI9U~9T~8p4)J9U~9T}9Q|9R|9X~:rn9U~9T|9Q~IsU2-i<8AsJ9U~:\s9U~Oss{K+ <*bufu=+7-M=*nv =+-J>-,rv?>,memA?8saiK9Uw9TT9QQ8sFDK9Uv9Tw9Q|9R}8saK9Uw:sa9UwO,utcL+ e?*bufu?+7-?*nv @+-I@GtJ9UU9TT9QQ9RR9XXOqm t{M+ @*vecM@+ -0A*nv iA+-A-,rv?fB,memB27-B8?ta9M9Uw9TT9QQ8atFDcM9Uv9Tw9Q|9R}8kta{M9Uw:vta9UwM{Oot>N+ BC*vecM{C+ -C*nv C+-&DGtcL9UU9TT9QQ9RR9XXOa!-t3N/! U*nva" _D+"-D,n#-D,i$-EOjB?tO+lBO?E+AC-E*memDuF,rvE? G2F TG8u8a;O9Us9T X8+uU_O9Uv9T|9Qs8Ou`}O9Us9TvFeua Oi<?uO+l<OG+A=-GGuN9UU9TT9Q0Lw_u&P+_ 5H,mem`H=udP5"H?u5H:uh09Us9TvGu`9TU!tP ?# s5nvOx\dubV+?#d )I+se5.J+ePffJ*infaK+g-K+[kg?K,rvh L2ia8M2jaM-ik?2bl?6O,memmOPwyPLs{QrV3 vDv*R5 XP5 XPFv`F'v`3 vD@UR5 4Q5 WQ3 pw ER5 zQ5 QEPEkS2`t-Q=# zR54 Q3PY}EDS@P5P,R1ECP=m}'S@)@:m}9U9T:,zP69U9T|9Q}9Rs3?P{ES5PbR5\R5sR5h)S1E7LS:s{b9T}9Qs3?{E+9T5PS5\S5sS5hS1E7T:{b9T}9Q8vP6oT9U9T|9Q}9Rs9X79Y@<$88w&bT9U~9Q~8\wEbT9U~8wP6T9U9T|9Q}9Rs9X79Y@<$8x&bU9U9Q~85xEbU9U8xQ.FU9U9T9Q}9Rs8yiBfU9U9T8yQ.U9U9T9Q}9Rs8zP6U9U9T|9Q}9Rs9X58z1U9U9T08B|`bU9U~8j|&bV9U9Q~8|`b2V9U~8|&bTV9U~9Q~FE};rVbVOiI}VKW+?#I IT+sJ[T+ePJT*inKaU+K-SU+[kL?U0rvMP-D N@:}P9UU9Tw9Qv9RR9XX9YYOiB~X+?#B U+sC[U+ePC7V*inDapV+D-V+[kD?VG~wV9UU9TT9QQ9RR9XX9YYOlj; ~X+?#; W+s;[TW+eP<W*in<uW+<-W+[k=?8XG%~KW9UU9TT9QQ9RR9XX9YYOyJ?0~@7Y+?# qX? 4~.5 qX5 qXF@~`FL~`Ov?p~Z+oZX*memXY,rv?Y2?# $Z8~8aY9Us9T8~e>Y9Uv9Ts8~`Y9Us9TvF~a Om?SZ+oZZG7Y9UU9T0LZm#Z+?# Z,mem+[8"?Z9UsG3`9TUOTr ?@_[+ a[*idx -[*nv [[+q ?!\GP49UU9TT9QQ#9RQ#9XRRQOm ?P[+ m\*nv [\+q ?\GUn9UU9TT9QQOr ?`3\+ ]+PS -Q]Ge9UU9TTOi p]*res U]+u ]*fin ]+H 5^+$ -n^*in u^/ u/n -Gu9UU9TT9QQ9RR9XX9YY99On) - l]/) U?# * @4 U4v  ] x A idx -Ol.  #"^+. ^*idx. -,_?l] / 5]z_5}]^G/9UU9TT1O:3 -S^/3 UOn8 -^/8 UOj< - ^/?#< U?# = @4 UOCjA  #a_+?#A _*idxA -`?l] B 5]b`5}]_G /9UU9TT1OBF - _/?#F UO>pK -0_/?#K UA _<S'v0_ `"_T< T U ?#`-Vj A?B`-U=m-]`a-Us?}`a-WD`TUq``a-?Uzr?``Xu`lW( aUP ?&aXBu8alV 'Ra-W/ NcaV*tH?aaa-lV ?au-U -aWN aV ?aM-Yy`#Vzxu&bu-Vu9?Eba-W x`bu-Z\i` ,.|w@W: 87int<7iYiq2290F1M3T578i P#.||T|||B|B||||||{[{{[{K{{5{{7{{{{ {h{m{{{{'{{g{{{{Ixxxxxx/ # @F Z - | fl | |&   - - .   - (W \ +` 4d Zh |l  m "Bfww*c2sym4w5B9;u" @A\BwC;H?.# (0l8\@@HPXO s` yh ?pE?tzpxMM[k~&{/0123-q5?c7s65s+y ?B;( % (#end +#pos .# 1#Y 3# ^ 4 |0 %75 %buf @ / %cur %mem / - -  -(v -0 -8 +h-Tg-T=m"-@6src")`len"-`i#-Ha $-as-?KN-Nbsrc-)bw.- csym/TCcend0)ycA\1cx2Sd 3-vdw4-erv5?ne׀A e!2 "U|"T8%!x 8"U|"T8%#ǁ "UUZ $\ijЁ %ctxjUqn, %ctxnU%bufo, Tsrco)e&wp-R&^kp?Xendq)f'wrcPts2 Qfctf8 czr? l %ctxUw ()WwE l c ()EwF )< y) y*P ? N JF..wXY7int<7q2290+1239 *2|sym4qw5> @A\BwC U Ww $ 3 U U Ew`H  ..@xЂY7int<7q2l2 age4w44xzwz x $x"Ђ x"4U ,x "/.Rxx+Z7int<7q24290;  }HPz!z{ - f-U HPzT !zQ {4R #^ f#-U e)4  f)U  Oa.@( f.-UP0.ypZ: 87int<7q2290F3T578 .||T|||B|B||||||{[{{[{K{{5{{7{{{{ {h{m{{{{'{{g{{{{IxxxxxxhD \ *7^    Q^w P Q^PA ET KU xY- Uy]- ya- ze-( 0yi-0 ^n8 }xr< xv@ >"zD z~?H z?L y?P S{?T y?X Rz?\ z?` 2d %NRRjZaQ LPjYJM],] ?qb?N p AGYMO`uzDK"DDy?p#]{]fU1TcDty'Y^'cgUUz)Y^)cUval)?Tjx.Y^.cUval/Tz4ЃSY^4cUval4?Tx9Y^9cUval9?Tx>Y^>cUval?T{H$!Y^HcUIT FOWgzgd{R0DYY^RcUST@{fY^fcUvalf?Txk Y^kcUvall-TByq Y^qcUvalr-Tyw 9Y^wcUvalw?Ty| qY^|cUval|-TyЄ Y^cUval-T?z Y^cUval?Tz Y^cUval?Tz^Y^cUET!KQy Y^cUval-Tw--wV1. "\: 87int<7q7 i29 my?290F3Ti P"" - .| | T| | | B| B| | | | | | { [{ { [{ K{ { 5{ { 7{ { { { { h{ m{ { { { '{ { g{ { { { Ix x x x x x ? (: G- T- oX- _\- H` AaD D mQH- HPL P HT ]Y Zbfdf?ptrjw z!k GNhdH xM- LN+ Y| ;  3  pZ } HP ! {  @hd x- fnva( -0cat|8  Qhd f j. hd ;\ ]  E   hdniv-iv N 0Thd x -nva -  ( ],  %hd) -p W.` 05hd9 &= ;\A E-  I- ]N( }O V2hdZ Y^ ]c d kahdo +ww x>@hdTN "rQVT_ 2exta Nm $;;-?wA &RX{;-?w $)'?;-%w #L--?w o9l%--?w  17?PPwV gm?P?w .?;-w 91 R*1 "g 9!9? w '~1 )1 7 ?i P;-;-w B-u { ? P  w3 /1 a24u )P   P-w 2i  ! P-w 1- 3 ` w 6l r  w Z!  ?  w  5  ?  ;-w 7   ?: :  ww 9- L R u --Pw 7P   --Pw B3n  ? -w 0  ? ?-w 1  1%x $,&3F&#:w9A F% K[(.P09T8Z*X@"]HA!aP(f X)k% `J-li h/r pi2s x)z 2  1! 6` b! ,){9@ 7u %7 5 J3 0 |? # ]~ g30U1T  }'P1' gUKUU|+`Hcbs, U$,T0~0pcbs1 U$1FT5cbs6 U&#6Tk~:cbs; U&#;TH?(cbs@ U A%TÀE`cbsF UG[T~KcbsL U.MT{QЅcbsR U9ST||WcbsX UZ*YT}]@cbs^ U"_TP}cxcbsd UA!eT}icbsj U(k To cbsp U)q% T/u0 cbsv UJ-wi Tn{@Xcbs| U/} T{Pcbs Ui2 Ta`cbs U) Tpcbs U) T 8cbs U1! Tpcbs U1` T|cbs Ub! Tcbs U,){T}cbs U9@ T~ІPcbs U9u T}cbs U%7 T=|cbs U5 T#}cbs UJ3Ī T@0cbs U0 T wK--!wh3. z]: 87int<7q22 # w - w|  w w|& w - - w. w3 w - w (W ~ \ w +`  d  h  l  m 3 -w ptr-w%ht`--^h-wh%UUTT ؁'w0`'-ht`'- i'wBi5,UUTT!@ptr!w{i!wiEGUU wPt`-iw&jUYUUy`6#`~ 8wpzmem8#_jt`8-jUT<mem<#jptrP: /=# Z8? &A QD g\H FFL |&O JdT r,W  h;Yp#$ X[p#D 1]#d +`#h >"c#l *f p Z5i q U0l r Yzn s %p t  "s u 2w v 2~"w .||T|||B|B||||||{[{{[{K{{5{{7{{{{ {h{m{{{{'{{g{{{{Ixxxxxx (" % & 7(len*-ref, (:iG ToX-_\-H`  Aah \ *7^   ' Fc  DFmQH-HPLP  HT  ]Y  Zbsfdf?ptrjz!kR9   -   V#s)K   -   #3!'s9+.,6c!:s9> )??GhdHFxM-LNoY;3p }HP!{ @` hdFx-fnva` (-0cat8i   hdFfjr  hdF;\#   E #  / hdFniv-iv/  N 0 hdFx -nva` -  (] ,A % hd)F-   W. 05: hd9F&=;\A#E I- ]N (}O Vv hdZFY^]c  dF k hdoF+wx @> hdFT f r  V5  _ :  v ext N $V \    - ?   &  K   - ? $)'  ?   -  > #L  4   - ? o9l@ F Ki   - ?  u { ?   >   ?  ? .  ?     - 9u R*u " 9!99??]  # '~u )u{?   -  -  B-?     /ua24)P5  -  2iAGKe  -  1qw   # 6K   # Z!?   F5%+?N    - 7 Z`?~  ~  9-    - 7P K   - B3n ?  - 0 *0?S  ? - 1 _1 % $ ,J & 3  &# :  w9 A4  Fi  K ( . P 0 9 T 8 Z* X@ " ]!H A! a-P ( f]X ) ki` J- lh / rp i2 sx ) z 2 5 1 e 6  b!  ,) 9  7  %7 N 5  J3  0 #  - |  |& / - - . ;AZ - (W \ +` d h l / m Z`(J/#inc6?`7 #- .-S -G  /nov-ov#S$_RHPV [._-^` X *ctx map 9@ A -@  -H  P4#64# ctx  / @ 2 H " p -  u+  *  %  20 - ( - 6 -  - $ - 8 J - j  ,  (  %*%  obq  -9 0 (9 8 1 .@ 2 .H 1 .Pseq .X / !` 0 !h 8 !p 35 !x v/ ! Z/ ! e V T g+ - HP Q g\ FF |& Jd ! P# # @& - 7 * , # H  8  2  2  A  3  'E  ) o *#key + T ,E - /k .v 0kmem 1q t` 2-  3# 4# 5" 9  ;u" <t% )vAWbsDxc(% (end+pos. 1 Y3 ^4|40Y 75Ybuf)@ /YcurYmemq / - - -( v-0 -8_  8B=nvvnWuvJqqj=op1kp1w'jn*svtndku*ll s o!p"4q#r$q%&o&t'gq(q)j*v+k,q-lp.k/uv0Gv1n2s3[v4~o5Vs6m7Vn8q9s:s;o<El=m>os?pVll-r wMP nv cnv i 75 @seq #H o #L y  |  r  H < B  >  ^ -  -len -   J?7#!8 )  `45o82'B$ 3A $4G1 , 8 2 9 U@  i mem q  -( I -0 1 #8bad <m Է! ) .v )9 " In#FJ##K#L^-MD* !+s 9,")$y%v1.3%v2/cW,' ,x(? `(0W,1(<%dpw= e> ;\A# 6D $#E HidpwL HT eofY  7] 8^0l Hn 0otr 7u 0v"(y#Tzi# {%#|%ext}v*~00T V> f-n@ ~*` 2. s0T 2  /T "Tn-Z& ('-((*q,mem.q mQ0- 3- |5 6  17 )e&2x-!+.U" C  P X)24,)%1q. * 3  i!'5%-9++. (8$30g W65 Q9!%*!&p# "^! E$. !K&.val(. $+.p#,!! H!6 &$:,(Mi!PO! VPT E2Q -R!H7S! vH","<9!(;6/'?)( / ;. 2 / Y34$S'5-!!" V> f-n@iv/ ` +h 7 7niv- -- +0- x- -H" *" "r'S" p# ]# *# x# .-# # ## b5# ]0###'ƫ# 75ǫ#iv/ niv-{#'{#(# H####h% H?   . # (0l8\@@HPXO %` %h ?pE?tzpxMM[%k%~&{/0123-q5?c7%&% 65% +% ?o%#%h%%'|8&bR-i|Y%q?& 7uleny-z&o&  J&"&#?#v#o&%vec?&ق& & H#(z&قܯ&r'pos end  -#r&)+$ ;'*c$ )M?l'+%M!*nvMl'+&N#r')ĂV?'+%V!)ga?'+%a!,lwsT?'-sT -nT-.iU-/S(?V(0a(U0b(T0n(-Q1i)-m2aa* U2bb* T3!'-k(41'n5!'-41'}n/~6@(6s6 n6len6-5o1n7no1i8-o7>?ЈB)8%!U8V T9' PF4'hp7_?)8%!U9w'F4'p4'p7B?  )8%!U8V T7I?02 *8%!U7D@?p:I*8%!U:n-p;` 3+<% ! q#-r=i$-Mr?F=nv53+r@:2*AU AQ6@]:2+AU ,AQ4B:2AU ,AQ79+i76GF?&,<4F&,r< F js<_G-s=priHsCsfpI'CkeyJ?&~CvalK&=rvL?t@͋Y2,AUsATTAQQBދz2AUsATvAQ|D <?b,E < -len<-F= )<h?,+%h!*nvh,+di?+i5i?GAj)?,+%!*nv,+d?7KI^?P 2<"^u<%^!Cv+$1AUwBF2AUwQ,,b14I,4=,/JbOU,RN{2N/2Nэ3N-3NrH3Nc3B4~3AU +,AT ,AQ AR P.22R<%R%SjA?Y2   -TZt2 t2  -'U?2 t2 2 2?&&TT22 &, S-T, 2 22U]h?2  -UBh?3  -Ug?-3  -Ug?H3  -Ug?c3  -Uh?~3  -VD T 9.ŃpJbc: 87int<7q2y?290F   .| | T| | | B| B| | | | | | { [{ { [{ K{ { 5{ { 7{ { { { { h{ m{ { { { '{ { g{ { { { Ix x x x x x  7 len-/("x%w&7(len*-ref, ~## w-w| ww|& w--w. w'w-w (W r \ w +`  d  h  l  m 'GGu!?p[ ! ut`!-Ԃmem"3p#jUvT|(r*t5?ЕL5  src5xVw6-mem6rv7?'U|TvQR T}Qv~ p /TU!BuK0("KU!uS@RS# .$~`[1 rTUU w.T g.QXR .%y&p_ 0"_Ures`}Ճd? _"d_Ue#' 'w-'zx-(1)ww) DT<.5d: 87int<7q2290F3T `(J/ inc6? `7 -T  AU T!Ж\ A!\UA! &?A&\ &0len'-iUUTTQQ6Ga?\-*=..e7int<7q2257- p# "E$!K&val($+p#,$E rlU ET !KQ GR" oz rl"U $" d#,@#vYC4 rlCU nCT>.tA6f7int<7qd^4^2fKl[wMxmzlE{257- gN" t# _N1A tp2` rv34 ؗ6 ؗψߗU0U1Tw_VV4J9?.f: 87int<7iYiq22@ PT OT < G=  Ą@    H?   . # ( 0 l8 \@ @H P X O `  h  ?p E?t zpx MM [  k ~&{ / 0 1 2 3- q5? c7 65 + ?! 77̄8U<(@.gint5(M790_3x<7q: 22 |8bR-i|Yq# 7u# leny TzY B B4  ; vB Yvec)ق  Hmdقܙr pos end -m Tr  ';DsfpD  ;dcT'sfpDopm"sfpDOsfpDJ;sfpDrv;J݅;7sfpDrv;G݅G7q.sfpDUJ Z;@~sfpDU 4T!7) )";CH#sfpDL$ɘL3%Us&L%Us;'sfpD(4!J;3! Bˊ)len!<*) 9&%U  :%T :%Q %R 9 ) w;}sfpwD+4w,7x,Hym}aY;sfpYD+4YrvZ;val[a ;0sfpD+4,7@-fin)@06;sfp6D+46b7;0Ѕ;sfpD+4,7"Z;#sfpZD.4Z/. I]KK6?0 I1WȎ1c2o3Hbn4H1ʏ5P2&%H%UU%Tw/ԛ`Ii90`I1o/$IdCА0I1b6'2/E`IfbV0I1n*2x&H%Ts7;= #sfpDM.4Ւ8rv;* 939 93dQ L pӓ{ 3n 93d  :pS;{$ %U :%T :%Q %R 9$M %Us$ 4$25 9& %U :%T :%Q %R 9&ޟ%Us%T07q; M` #sfpqDՔ.q.Ņq88rvr;5*p 9/eJ k3d֠} p{)3dX pM{p$ %U :%T :%Q %R 9<ʠ$C %Us?Q%UU%TQp ` =pDQ 15) 9>"2 4"25) 9&%U :%T :%Q %R 9& %Us%T0%Q0m); sfp)D+4)rv*;7V;Q#sfpVD9.V.ŅV8rvW;* n93+p9/Q w0Jpn b ؛00J1z $&%Us%Tv$%Us$%Us$%Us$%Us%T|&o%U :%T :%Q x%R n907;; A#sfpDG.48rv;̝*A _93-9$K%Us$Z%Us$f%Us$%Us%Tv&'%U :%T :%Q %R _907;0s#sfpD(.48rv;*s P93l&93-9$U%Us$a%Us$^%U :%T :%Q %R P9& %Us0@ZP7AsfpDUBTT.@@ .4 K#src 8p 8q V8o #8len &C I$i%U|%Q$%U}%T\%Qv&/%U|%T}%Qv )@a4.44l#src4 D@5 @58oE#8pF8endF8nGm8iH8idxI;B* @9Efinx$Ƨ%U X:%T :%Q a%R @9$%U 7:%T :%Q h%R @9$H%U :%T :%Q K%R @9&#%U 1:%T :%Q ^%R @9;` FDGGGxGHGG!GI\G!G;G% : ; I$ > $ >   I&I'I I &  : ; ( : ;I' : ; : ;I8  : ;  : ; I8  : ; I8  : ; : ; I!I/ .: ; ' : ; I4: ; I.: ; '@B: ; I: ; I4: ; I1RUX Y 1! U"41#4: ; I$.?: ; '@B%: ; I&: ; I'1(.?: ; 'I@B) *4: ; I+1,B-B1.4I4/0B11B1234: ; I?<4.?: ; '<5.?: ; 'I<6.?: ; '<% : ; I$ > $ >   I&I : ; ( : ;I 'I I ' : ; : ;I8  : ;  : ; I8  : ; I8 : ; I!I/ .: ; 'I : ; I: ; I.: ; ' 4: ; I4: ; I.: ; 'I@B: ; I: ; I: ; I 4: ; I!1X Y "1#1RUX Y $ U%41&1X Y '1RUX Y (1)4: ; I*4I4+1,B-1.1/.?: ; '@B0: ; I1B123.?: ; 'I@B41RUX Y51X Y61RUX Y7.?: ;'I@B8: ;I9: ;I:4: ;I;4: ;I<4: ;I=1 >1?.?: ;'@B@4: ; I?<A.?: ; 'I<B.?: ; '<C.?: ;'I<DE.?'I4<% : ; I$ > $ >   I&I : ; (  : ;  : ; I8  : ;  .?: ; '@B: ; I: ; I U4: ; I 4: ; I1.?: ; 'I@B1B4I4B1I!I/ .?: ;'<I.?: ;'I<.?: ; '<% $ > : ; I$ >   I&II !I/ : ;I 'I I & : ;(  : ;  : ; I8  : ; I8  : ; : ;I8  : ;I8  : ; : ;I : ;I' : ;  : ; I8 : ;  : ; : ; .: ;'I  : ;I!: ;I"4: ;I#.: ;' $4: ;I%.?: ; ' &: ; I': ; I(.?: ;'I ).?: ;' *.1@B+1,41- . /10B112B13 U4 U5416B1718.?: ; '@B9: ; I:1;41<: ; I=1X Y >1 ?1X Y @: ; IA: ; IB1RUX Y C.?: ; 'I@BD4: ; IE4: ; IF4: ; IG.?: ;'@BH: ;II4: ;IJ1X YK: ;IL: ;IM4: ;IN.?: ;'I@BO4: ;IP4I4Q1RUX YR1RUX YSB1T1BU: ;IV4: ;I W4: ; I?<X.?: ; 'I<Y.?: ; '<Z.?: ;'<[.?: ;'I<\.?'I4<].?'I4<% : ; I$ > $ >   I& : ; (  : ; : ;I8 : ;I8 : ;I&I'II' : ;  : ; I8  : ; I8  : ; : ; I!I/ .?: ; ' : ; I.?: ; 'I : ; I.: ;'I : ;I4: ;I 4: ;I!.?: ;'I ".1@B#1$1%1&B'.?: ; 'I@B(: ; I): ; I*4: ; I+1X Y ,B1-.: ; 'I@B.4: ; I/1RUX Y 011412 34144154: ; I61X Y 71 8.: ; ' 9.?: ; '@B:4: ; I;1RUX Y <.?: ;'@B=: ;I>B1?: ;I@4: ;IA.?: ;'I@BB: ;IC4: ;ID1RUX YE UF1G4: ;IH1RUX YI4: ; I?<J.?: ; '<K.?: ; 'I<L.?: ; 'I<% U$ > : ; I$ >   I&I'I I &  : ;  : ; I8 : ; I8 : ; I8 : ;I8: ;I : ;  : ; I8  : ; : ;I8  : ; : ;I : ;I8  : ;( I!I/  : ;I' : ;  : ;   : ; ! : ; " : ; I# I$ : ; I%: ; &.: ; 'I ': ; I(.: ;' ): ;I*: ;I+4: ;I,4I4-.: ;'I ..: ; ' /4: ; I0: ; I14: ;I2.?: ;'I 3.: ; 'I@B4: ; I54: ; I6: ; I74: ; I81RUX Y 91: U;41<1=B>.1@B?41@1A41B C D1E.?: ; '@BF: ; IGB1H4: ; II4I4J1RUX YK.?: ;'I@BL: ;IM1X YN.?: ;'@BO1RUX YP: ;IQ1X YR4: ;IS4: ;IT1BU4: ;IV1W1X4: ; I?<Y.?: ; 'I<Z.?: ; '<[.?: ; 'I<% : ; I$ > $ >   I&I<  : ; : ;I8 : ;I  : ; (  : ; : ;I'II : ;I8 I!I/  : ;I' : ;  : ; I : ;  : ; I8  I : ; I : ;  : ; I8 .?: ; 'I@B : ; I!: ; I".?: ; '@B#: ; I$: ; I%4: ; I&4I4' U(1)B*B1+.?: ; '<,.?: ;'<% $ > : ; I$ >   I&II !I/ 'I I &  : ;  : ; I8  : ;  : ; I8 : ; I8 : ;I8 : ;( : ;I : ; I8  : ; : ;I8  : ; : ;I : ;I8  : ;I' : ; : ;   : ; ! : ; " : ; # : ; I$ I% : ; I&: ; '.: ; 'I (: ; I).: ;'I *: ;I+4: ;I,4: ;I-: ;I..: ;' /4I40.?: ;'I 1.?: ;' 2 34: ; I44: ; I5.: ;'I@B6: ;I74: ;I8: ;I94: ;I:4: ;I;<B=.: ;'@B>: ;I?1@B1A1B1X YC1D : ;E : ;F UG1H4I4I J41K.: ; 'I@BL: ; IM: ; INO4: ; IP4: ; IQ4: ; IRS.1@BT1U41V W41X UY1Z1X Y [1RUX Y \.?: ; 'I@B]: ; I^.?: ;'I@B_4: ;I`.?: ;'@Ba1Bb1RUX Yc41 dB1eB1f1RUX Yg1X Yh1 i4I4j k.?: ;'I@Bl 1m1n!I/o4: ;I?p4: ; I?<q.?: ; '<r.?: ;'<s.?: ;'I<t.?: ; 'I<u.?: ; 'I<v.?'I4<w.?: ; '<% U: ; I$ > $ >   I&I'I I &  : ;  : ; I8 : ; I8 : ; I8 : ;I8 : ;( : ;I : ;  : ; I8  : ; : ;I8  : ; : ;I : ;I8 I!I/  : ;I' : ;  : ;   : ; ! : ; " : ; I# I$ : ; I%.: ;'I &: ;I'4: ;I(.: ; 'I ): ; I*4I4+: ;I,: ; I-4: ; I.4: ; I/ : ; 0.: ; 'I@B1: ; I2: ; I3: ; I4: ; I54: ; I64: ; I71RUX Y 819 U:41; 1<1=B>1?.: ;'I@B@: ;IA: ;IB1RUX YC.1@BD1E1F41G4: ;IH4: ;II1X YJ K.?: ; 'I@BLB1M4: ; IN.?: ;'I@BO4: ;IP4: ;IQ1R: ;IS : ;T4I4U4: ;IV.?: ; 'I<W.?: ; '<X.?: ;'<Y.?: ;'I<Z.?: ;'<% U: ; I$ > $ >  I&I &  : ; ( .: ; 'I  : ; I .?: ; '@B: ; I: ; I4: ; I 4: ; I1X Y 1.?: ; 'I@B: ; I1: ; I U4: ; I4I41BI!I/ .?: ;'I@B!: ;I": ;I#4: ;I$4: ;I%B1&: ;I'4: ; I(.?: ; '<)I*.?'I4<% : ; I$ > $ >  I&I&.: ; 'I@B : ; I : ; I 4: ; I 1 B.?: ; 'I@B1.?: ; 'I<I% : ; I$ > $ >   I&I&  : ; (  : ; : ;I8 : ;I8 : ;I : ;  : ; I8  : ; I8 'II' : ;  : ; I8 : ;  : ;  : ; I!I/ : ; .: ;'I : ;I4: ;I : ;I!.: ;' "4I4#.: ; 'I $: ; I%4: ;I&.?: ;' '.?: ;'I ( ).: ;'I@B*: ;I+: ;I,4: ;I-4: ;I.: ;I/: ;I04: ;I1 U24: ;I31RUX Y41 51641 741819B:1;.: ; 'I@B<: ; I=1X Y>1X Y ?1X Y@1A4I4B.1@BC41D.: ;'@BE UF1GB1H1I J41K L.?: ;'@BMB1N1RUX YO.?: ;'I@BP : ;Q4I4R1BS4: ; IT4: ; I?<U.?: ;'I<V.?: ; 'I<W.?: ; '<X.?: ;'<Y.?: ; 'I<Z.?: ;'<% : ; I$ > $ >   I : ;( &I : ;I 'I I ' : ; : ;I8  : ;  : ;  : ; I8  : ; I8  : ; : ; I!I/ .: ; 'I : ; I.?: ; 'I@B: ; I4: ; I4: ; I: ; I1X Y  1!1"B#B1$.?: ; '@B%: ; I&: ; I'4: ; I(!)4: ; I?<*.?: ;'I<% $ > $ > : ; I : ;  : ; I8  : ; I8 I !I/ 4: ; I? &I !I/ % $ > $ >  I&I : ;  : ; I8  : ; I8 : ; I .?: ; 'I@B : ; I 4: ; I% $ > $ > : ; I : ; : ;I8 : ;I.?: ; '@B : ; I  I .?: ; 'I@B &I .?: ; '@B% : ; I$ > $ >   : ;(  I : ;I  : ;  : ; I8  : ;  I!I/ .: ; ' : ; I.?: ; 'I@B: ; I1B.?: ; '@BB1: ; I: ; I1RUX Y 1.?: ;'I<I.?: ;'<% : ; I$ > $ >   I&I<  : ; ( : ;I  : ; : ;I8  : ; : ;I : ;I8 I!I/  : ;I'II : ;  : ; I8 .?: ; 'I@B: ; I1B.?: ; '@BB1: ; I: ; I .?: ;'I<!.?: ;'<% : ; I$ > $ >  : ;I I'I I '  : ; : ;I8 .: ; 'I@B: ; I: ; IB1B.: ; '@B.?: ; 'I@B.?: ; 'I@BB.?: ; '@BBB4: ; I.?: ;'I<.?: ;'<.?: ;'I<% : ; I$ > $ >   I&I'I I &  : ;  : ; I8 : ; I8 : ; I8 : ;I8 : ;( : ;I : ;  : ; I8  : ; : ;I8  : ; : ;I : ;I8 I!I/  : ;I' : ; : ;   : ; ! : ; " : ; # : ; I$ I% : ; I&: ; ' : ; ( I8 ).: ; 'I *: ; I+: ; I,.: ;'I -: ;I.4: ;I/.: ; 'I@B0: ; I14: ; I24: ; I31X Y 4151X Y 6: ; I7.?: ;'I@B8: ;I91RUX Y:: ;I;.?: ;'@B<: ;I=4: ;I>4: ;I? U@1ABB1C4: ;ID.: ;'I E: ;IF4: ;IG4: ; IH4I4I J K1RUX YL1RUX Y M1N1O41P41Q1X YR4: ; I?<S.?: ; 'I<T.?: ; '<U.?: ;'I<V.?: ; '<% : ; I$ > $ >   I&I&  : ; (  : ; : ;I8 : ;I8 : ;I : ;  : ; I8  : ; I8 'II'.?: ; ' : ; I.?: ; 'I@B: ; I: ; I4: ; I1B1.1@B1 B1!.?: ; '@B": ; I#4I4$1X Y %I&!I/ '.?: ; 'I<(.?: ; '<).?: ; '<% : ; I$ > $ >  I&I : ; : ;I8 : ;I8 : ;I .?: ; 'I@B : ; I .?: ; '@B: ; I: ; IB1B.?: ; 'I<I% $ > $ > : ; I : ;  : ; I8  : ; I8 .?: ; '@B : ; I : ; I  I : ; I 4: ; I4: ; I.?: ; 'I@B% $ > $ > : ; I : ;  : ; I8 .: ; 'I 4: ; I .?: ; 'I@B 4: ; I 4: ; I 1X Y  411B.?: ; 'I<I I.?: ;'I<% : ; I$ > $ >   I&I : ;  : ; I8 : ;I ' I : ;I8 : ; I!I/ .?: ; '@B: ; I4: ; I?<% $ > $ > : ; I  : ; (  : ;  : ; I8 : ; I8  I  : ;  : ; I : ; I I8 &I&.: ; 'I : ; I.: ; ' .: ;'I : ;I4: ;I4I4I!I/ .: ; '@B: ; I1X Y 1.: ; 'I@B : ; I!4: ; I".: ;'I@B#: ;I$1%B&1': ; I(: ; I)4: ; I*4I4+: ;I,4: ;I- : ;.: ;I/1RUX Y0 U14124131X Y4 5416 17.?: ;'I@B84: ;I91:1;1 <1=.1@B> ?B1@.?: ;'@BA: ;IB: ;IC4: ;ID4: ;IE : ;F.?: ; '<GIH.?'I4<I.?: ; 'I< /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits./includes/nghttp2/usr/includenghttp2_pq.cstddef.htypes.hnghttp2.hnghttp2_int.hnghttp2_pq.hlibio.hstdio.hnghttp2_mem.hassert.h PX6u JuMM@9Kw=fIKl<L.7O?[ fzJ^G=&J[.7JyX`x.5:>2g?xt KM,?l t~$Kuuui;=2x*N0yf xu0gxJ.&\,T.-fS-fwu@T 19[iP~ttMZlXJjG$~~KbjxLH=u>d>KYCy1===K4[o/Lx<xcuKK=JZuKK=%JQJKKu,J>KMJ3<=CuKK=;JKK=x<y==KK=uKK=J=w-[uKK=J~uK==J~XKK=J?K=KKG@]$j=W5~J=KKuJKtJG@]$~JKKuJ?K/KG@[$0yK ug>TtMZxv,L2k;I==-sGXyi*%O7YYL9@E]+> >Ii[yX iZYst 'iZYtt ( =v:sYrLV]IYI=btMW2Zi+NpX+K;KYIY19M9[L:L/v.t9M20rVlI/wt Jyx҃MZxL,2;=-=-ufUXfX >Z@i[Ltt #xZL:YZ w  gf#!;KYIZH?K\2F/R\t2 </vX .iZYtt ( >|L>ZZLKoX ,OHC9M;KyKW.lXx<(ZL;=2b]HC;K9Jh.Jx ȴ:N2\*Z:KYsT@T5"/ot :wJ J.v.HHY;=5UK>iY=I[KY:[uJ <wt.I/M.3Xh<|L>LZZKsX #1G[0M[G12ztKIKOrX+A)"\=,Km<wX#^z )g4z<ޑYz XL:vk> <s.K /mJbvKKYNKKYmt t/Ev9.Y)YsKbf$Ygp 419.>ItLLIY2XKiOMUM#f /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/include./includes/nghttp2nghttp2_buf.cstddef.htypes.hstdint.hnghttp2.hnghttp2_buf.hlibio.hstdio.hnghttp2_mem.hnghttp2_helper.h  {u; =\uZCy.$8@vXr:>;=2w9uvryvtd yu2[UM9 ?Y;K2vDJ`V%SjN^GG=LK.UM9MYX<t=.=Qu.KK~PY;Yr=~t;=/7Bz< .UYYzXK`,[bJJb]\# ;/=;y"YL!;=/ Jzh:Ys< <tJ.e/rL/m X feL!>/`X XL./S&X fKL;>/F3X  M=;\Xq;=4,MI=ntOX~fռ=;,~.L|JJ|<J>H|>H*Kq.=v:|JJ|<>MKgvX</R /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/include/sys/usr/include./includes/nghttp2nghttp2_stream.cstddef.htypes.htypes.hstdint.hnghttp2.hnghttp2_session.hnghttp2_rcbuf.hnghttp2_callbacks.hnghttp2_hd.hnghttp2_stream.hnghttp2_hd_huffman.hnghttp2_int.hnghttp2_buf.hnghttp2_frame.hnghttp2_outbound_item.hnghttp2_map.hnghttp2_pq.hlibio.hnghttp2_ratelim.hstdio.hassert.h `.*gJqtXu<nJfkV>gU Xl;>V>gUX\Y\?iGgh:h|.tsK|.v ]*OqvtLwJLX.hHh{|vVvX>pj/{Jv Jf vN \JL"JPI3|.LJz.mKLXLJI|.N:LgLb+ Gh:~fZJ3{XL|JsK{.vb  w fwf~XLf~vtLwJLJ w fw.~L<&zJB\~J;K/JlJ}J;K/Jt%HtJ rXyt u<KI=I .2uWXit=s/=-2=-.sf=W2=-"KKKKggg  Wp$ /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/include/sys/usr/include./includes/nghttp2nghttp2_outbound_item.cstddef.htypes.htypes.hstdint.hnghttp2.hnghttp2_frame.hnghttp2_outbound_item.hassert.h P]sgzf5]sgzf5v3^h k FJ:Jt vv:=1 ' /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/include/sys/usr/include./includes/nghttp2nghttp2_session.cstddef.htypes.htypes.hstdint.hstdarg.hnghttp2.hnghttp2_session.hnghttp2_rcbuf.hnghttp2_callbacks.hnghttp2_option.hnghttp2_hd.hnghttp2_stream.hnghttp2_map.hnghttp2_hd_huffman.hnghttp2_int.hnghttp2_buf.hnghttp2_frame.hnghttp2_outbound_item.hnghttp2_pq.hnghttp2_ratelim.hlibio.hstdio.hnghttp2_mem.hassert.hnghttp2_http.hstring.hnghttp2_extpri.hnghttp2_time.hnghttp2_helper.hnghttp2_submit.hnghttp2_priority_spec.h `F s_ly>r0wmstIg-u|򽃮IuYu>r&ztB `t~JXV*`xtZZJX&]]cʃ歭ZZ!x <! ݔvWBz3Ay<wztAo<<zgwhhfwfwgfwtX/MwIZwxxΑ",>>.B.!-=j x.ASOx+?j"Kg;Mʟf<'KfvJ .~t$H<1o}5yt XvX!PztBgZi-NJ;K2Nwutzy%+=݃!;vY[>:>;=j[ Nf%tl0:X>9u^.#q?/Z0uv.$"K;Z&g-H 0MrL# ~.J.~tK w.  f]$tv fY  _myjYz( t1JuzWtE.p MqM9YYY>dv_y.5:u XmJ./gXw-~uxvvv$uxvvv$uvYyYyzztx8 fsve<et/s`Z>:vYR:v14/Wf$4zf^tuohJ<ht5>:vYR:v4qhJ<ht3"/f wlkfOso; =1?zf^w< Xt>Y-/1YqfO yxq tzwJyt- Jwt!s tut1Gich f:L\b@Y!|x<4ztfA;=j J*YvfReJ6xtGt8.G8WT\˭;=i;=khv\Zd>YPv/M+P] {GXX:3jNwobtaf!.['jU,tTf..s=Y.d-,tTf.*  "Z,0[t2p٘u;/Nt uhWNWrJ2pٖLvt ptpJfpf>H>dXsk;=Xf'tXf'.e0,h/s Y~'#J] #f]<a{es ayl:u  u< +1rMsX<'KsrfK fXX'X<'gcf#]J#<Z/9?gYy'N~@y]y.^,tTf!.N2N<_X XXI+?u;xJ-=u;y.XajYa2p[G?]ZyȻKXk kJ,>@Q$i$\JX_yXztQy<_Y;=2#K1ntp2~*N>,>./p"NK]fJff&K=t.u;=\xOMiNo.ggfpJXp.XsfsJfjJ<j.t.m.f. /tWM[N >Ufs.Jn V-.St-f./sWO"Njt{;~{y.Y"j~̟Y!~0~Xt~~v .vX #-sv;gj/s/?>h*2_tj W,0ɔ8&$pxjuv =;ͻYWf /" .vt <t. J8ZgA ;Yf+ f-= fxI/ xkjX zf;Yk;YJf;=j5JXK5t\-=f< ffmfvBX.v1tfhph tM[i0}Jf wt fsX $vV2ZjLY\F2Kt0H0N&_ɟww<ɟV!|XvT7+TX+:LXih~.7A{fׁ~t#+?m~5:>g˭-=~ftt.u XIottO7y,03<w",>tz/.z"$"sfXt- YX*Xz ~t:>{f{fYsf |.}.u^z[zLI?9KL~ }J.~ʏ^SgȃLtXp<pff~ |zrf rȑvJ<{Xs ֟-= f~%5w {X<{.̟[{ !@x%\}NYV{yzz{z֟s t`~ 6n  hXXo^ftuxX $&zXvY;=2QzWi( J4 Xk;=1u;\ilzX0v, Jk.!LYYx3YYu.eD;Ks^htIN2K2gXk<&Y;=.+1Y\u< XvNLY;=1ULY[gUzMY\ XtXtgMMY;=4zXgKkmfofqfs fu fw fymKkmfofqfs fu fw fymZ,0.r Xs+\8\Z,0 .xZYyt (MZ\TMZ\T52*jW2,><s֮\,0Y\f<m ft< Xf-/ <tt|t| sXo<Xw]tw^z.4S,Tt0ftu~X~t s< < ȑ sX~t s< < ȑs%X~t =AzufX~t =AzVZsXhtx<y<[!==w >VZw.:w<z<XyzttA7yj{*v4=?9wg~(:;w<~<X~ttjzt~':w<~<X~t~JX~t =AzHv >IXH|ft|-Y~.~tgT,.Tt.)H|ft{-Yt}ZdsUf-,Tt*fٓR,Tt("sY;c.pX? r. .z. t> -/o>z֣T,Tt1$p><it>iJbg<Z,>==\h}*[fs=>dhi p.seZ,0rfo9ZrvJ,0qusY:h:<9Zro r:>:\ f9ZrvfJ t.eZht21+1͈zXZ,>\_y.Ys@tz.4g d,/ ֪\X/+1>,0̭H&us&|ttz~t;= fl/g=sf ~~tgT,Tt*" f~䄑}t}-YiqJC!y˭,u *[By.5x&usY)i ,0H0 ? t. .x1m;=2 |X{y.YȰ.j<  m.mX  ft|.Yfv րsvl{t{XY |t|Xo tv.ZPXt:nrIw f#9wj|tu.Yh|tYp .rd,Tt,2Tt2":vjif,xJt~|zT<,Tt(  KzJt HvyftyWY9wj)?we րrv fztzXY. րf : vX fzptBy.5&zX+?[ /7Azt :vgztzYsȅw",>c u }D}. uKuJAt>XA<><2K;Z,0 .e<.ifuW@J?\K;Zx fwf XhXc.r3-m@?X@<?<2KxfȊi-t@t?t\m֊- /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/include/sys/usr/include./includes/nghttp2nghttp2_submit.cstddef.htypes.htypes.hstdint.hnghttp2.hnghttp2_session.hnghttp2_rcbuf.hnghttp2_callbacks.hnghttp2_hd.hnghttp2_stream.hnghttp2_outbound_item.hnghttp2_map.hnghttp2_hd_huffman.hnghttp2_int.hnghttp2_buf.hnghttp2_frame.hnghttp2_pq.hnghttp2_ratelim.hnghttp2_mem.hnghttp2_priority_spec.hassert.hnghttp2_helper.hstdlib.h p54ztRx .&. <v u bJ<!f t+12yxJ.jB<b..bfb<<hr<z{Iz #vX 1#r~_Jp~ @r<t:Z:>jRyF2[.%._+12q4-` fvt t. XfN;=jNQw,L:h[ y2,L`.:.k4\Nc.XB .ut !;Yci>;=kO)Oyv=HK@p5;=kOyLOZK .^Jjwt>tPt t*$ g-2r<t f?;=kOyLO[K .Ut;=2/vxt&t18T\W;[8T\W;[8;Z8;Z .uX]o6xt N;=2O}KHOZK1k˫"%˫"%Y;Y;IgI=-xxxtztxJRj;=jhK2itؙ  @W-r"d /usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/sys/usr/include./includes/nghttp2nghttp2_helper.cbyteswap.hstddef.htypes.hstdint.hnghttp2.hassert.h GK x.uO" jY=_\[iuKn20ZWR=KM,hbfx'X0NiuL20qJXk zt&"f<dt `tbt*tttfXzzt  vtxtft2tNt6 Jt4Ltft>fBtf@t<Dt:Ft.ffntfltptrtv(fXt& Zt$\t.Xft ttfjprff0fPt.RtfffthtfftfX*fVtfXftfX5avT6-[_&YtiKXY\ͩ2wf-[yf622;":=2=tffy /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/includenghttp2_alpn.cstddef.hstring.h PP .wX:,WY/=vd2*?/=vd2* o /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/include/sys/usr/include./includes/nghttp2nghttp2_hd.cstddef.htypes.htypes.hstdint.hnghttp2.hnghttp2_rcbuf.hnghttp2_hd.hnghttp2_hd_huffman.hnghttp2_buf.hlibio.hstdio.hstring.hassert.hnghttp2_mem.hnghttp2_helper.h Q9wh:069/NE3u-KsK;2v=p/W=%f6+oBzfJ`f=yZqZ>J-wJC?-;hE(xR/>W1f` tUX=).vJ?C[<'jMdJW~fLZ~z sKYv}f<m}f<\}XW}<Sf}<Et}<<X}XW}<.}<<X}<<~X~<~tr(~<<~X~<}t<}Xr(m<<}XJ}Xf=}Xj(<~X~"<~t~&<.}.<}.XW<}.<}.XW~<}.<}.<}.<}.<}.<}.<}.<}.<}.<}.<}.<}.<}.9?2vwgs!"KlIYzXzJPx z.[eK~XJ~<YzKI=eIKfI|Kr|JJ?9Mz.>WOYtIzXwJ Jz .-։y.QJuNzJBz.DJoJxt`~X\iG?dJW~XVLZNB} twf hkysv =YuHLKIKKKr@YKCytPMwJ}XM}JJIKq}JJCy>:>w uX$8N?qw]\rw.x)wq|@FjSLHZ;=h t Jt yT2wJ[|f9tf`Zxf+6K.q:0Z:>Zxe%L:] 2\:>2PL/xPln!xJIg-G JHxJ[swf ~Xw s#Z|X|sYI= -s~.~ .&!!@#;wULiw\L%f} }<tZ~<!\@t0~.e1z.JH> Lt.Bf(\W=ZVuY.AR/.~vr;<|<tl@,yJCy C{.H>:vʸv<}<;tj?H,t~ !$V}J~}J}txX :;K~侅\gU?KUM@bx t< ,5\:>2PL/x.PlpK[I==$\wn^HL KKw[^HLKK  /usr/include/bits/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include./includes/nghttp2nghttp2_hd_huffman.cbyteswap.hstddef.htypes.hstdint.hnghttp2.hnghttp2_hd_huffman.hlibio.hnghttp2_buf.hstdio.h @!3hH ּz, U]y.  |X<|fvzXoZ f/ifZO)f+ LrL/Oz.g0KQtNdKKzJ zwR u`J XiZm<!Xw/}f >)?Xu XC<")^.~JX]YWY+ }_3֭]t$uL;Y:w~.'~&~Xؑ.t~J.}"fJfJ"+fUJ+fvDt.IK<.8 ,KtjIK~<~JfiIubt~tut J,~t~fIA~X~Xc /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/sys/usr/include./includes/nghttp2nghttp2_rcbuf.cstddef.htypes.hstdint.hnghttp2.hnghttp2_rcbuf.hnghttp2_mem.hnghttp2_helper.hassert.h p![GX?\>LIIKuuuv/tXG[Y-/2KK=XLn o%&KK /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include./includes/nghttp2nghttp2_extpri.cstddef.hstdint.hnghttp2.hnghttp2_http.h v/I=;/$V /usr/includenghttp2_ratelim.cnghttp2_ratelim.hstdint.h uKM4LE XL;=jfC,EC .v5v}^e /usr/include/bits/usr/includenghttp2_time.ctypes.htime.hstdint.h 0L@F3iz /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits./includes/nghttp2/usr/includenghttp2_debug.cstddef.htypes.hnghttp2.hlibio.hstdio.h 7s /usr/include/usr/lib/gcc/x86_64-redhat-linux/4.8.5/includesfparse.cstdint.hstddef.hsfparse.hassert.hstring.h ut + JvY%Z;=Mgf =W?j=W2L:>Yq.X{& rXxJQKxxJQKx2NjYe'QvyD([=+h;L;KL, Nv, ~PMq>"LH>j^_L:>ggx+~t;HgvJF2~K;=j#qf'!+ [=+h;v;KL, 8L:>-%4L:> Ut\ JXk{u9 X{JgfLY{"{tgf N$6~ֽt|J<|<'XYs%Y|=\J(tXYYux+ tyL:>kIg-|J N6֡9?"YPPJOWzJuXq.XvwYuuwv.L:>2gYuwLr@wkfYzPYYuwLr@ .HzJu-bJXxtNwg(#9? YPyJu&XGyJu-4Xg< XwlJYgwLr@ .\;@qMzEXgt==eAFGMgl;=/rX>]<'ȮXj.jXXc<bJ"Kdn/s=Iiat,gffTcNGHTTP2_ERR_NOMEM_shortbuf_IO_lock_tNGHTTP2_ERR_HTTP_MESSAGINGNGHTTP2_ERR_INVALID_FRAME_IO_buf_endNGHTTP2_ERR_TOO_MANY_INFLIGHT_SETTINGSnghttp2_memnghttp2_pq_initnghttp2_pq_emptyNGHTTP2_ERR_INSUFF_BUFSIZE_IO_write_endnghttp2_pq_entryNGHTTP2_ERR_FLOW_CONTROLNGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURENGHTTP2_ERR_INVALID_STATE_markersnghttp2_pq_topNGHTTP2_ERR_INTERNALnghttp2_callocbubble_downNGHTTP2_ERR_REFUSED_STREAMNGHTTP2_ERR_BAD_CLIENT_MAGICncapacitynghttp2_pq.cnghttp2_pq_eachnghttp2_mem_realloc_posstdout_IO_save_endnghttp2_malloclong long unsigned intNGHTTP2_ERR_FATALNGHTTP2_ERR_START_STREAM_NOT_ALLOWEDNGHTTP2_ERR_SETTINGS_EXPECTEDNGHTTP2_ERR_DEFERRED_IO_backup_baseNGHTTP2_ERR_TOO_MANY_CONTINUATIONS_filenoNGHTTP2_ERR_STREAM_CLOSINGNGHTTP2_ERR_PAUSENGHTTP2_ERR_CANCEL_IO_read_basestdinNGHTTP2_ERR_EOFminindexNGHTTP2_ERR_INVALID_STREAM_STATEnghttp2_free_IO_marker_IO_read_ptr/home/abuild/rpmbuild/BUILD/nghttp2-1.61.0/libnghttp2_reallocNGHTTP2_ERR_DEFERRED_DATA_EXISTNGHTTP2_ERR_HTTP_HEADERnghttp2_pq_IO_write_baselong long int_IO_save_basenghttp2_pq_pushnghttp2_pq_popNGHTTP2_ERR_PUSH_DISABLED__pad1__pad2__pad3__pad4__pad5NGHTTP2_ERR_HEADER_COMPNGHTTP2_ERR_STREAM_SHUT_WRNGHTTP2_ERR_TOO_MANY_SETTINGS_vtable_offsetlong doublenghttp2_mem_freenghttp2_pq_freeNGHTTP2_ERR_FRAME_SIZE_ERRORNGHTTP2_ERR_UNSUPPORTED_VERSIONnghttp2_less_IO_read_endNGHTTP2_ERR_BUFFER_ERRORshort intmem_user_dataNGHTTP2_ERR_DATA_EXISTNGHTTP2_ERR_STREAM_ID_NOT_AVAILABLEbubble_upnghttp2_pq_item_cbNGHTTP2_ERR_WOULDBLOCKNGHTTP2_ERR_INVALID_ARGUMENTNGHTTP2_ERR_GOAWAY_ALREADY_SENT_locksizetype_old_offset_IO_FILE__assert_failunsigned charNGHTTP2_ERR_PROTONGHTTP2_ERR_INVALID_HEADER_BLOCKNGHTTP2_ERR_FLOODED_IO_write_ptrnghttp2_pq_removeNGHTTP2_ERR_SESSION_CLOSINGGNU C 4.8.5 20150623 (Red Hat 4.8.5-44) -mtune=generic -march=x86-64 -g -O2 -std=gnu11 -fvisibility=hidden -fPICNGHTTP2_ERR_CALLBACK_FAILURE__off_tNGHTTP2_ERR_STREAM_CLOSEDshort unsigned int__PRETTY_FUNCTION__nghttp2_pq_sizeNGHTTP2_ERR_INVALID_STREAM_IDnghttp2_pq_update_flags2_cur_column__off64_t_unused2_IO_buf_basenghttp2_map_removenghttp2_map_each_freephashmap_bucket_set_datanghttp2_map.cnghttp2_map_freeuint32_tfprintfnghttp2_map_findpkeynew_tablelenmap_resizenghttp2_map_sizememsetnghttp2_mem_callocnghttp2_map_bucketdidxnghttp2_map_initnghttp2_map_print_distancenew_tablelenbitsnghttp2_map_eachpdatanghttp2_mapnew_tableh2idxnghttp2_map_key_typestderrnghttp2_map_clearmap_bucket_swapnghttp2_map_insertnghttp2_queue.cnghttp2_queue_frontnghttp2_queuenghttp2_queue_initnghttp2_queue_backnghttp2_queue_popnghttp2_queue_cellnew_cellnghttp2_queue_pushnghttp2_queue_freenghttp2_queue_emptyNGHTTP2_FLAG_PRIORITYNGHTTP2_SETTINGS_ENABLE_CONNECT_PROTOCOLpromised_stream_idNGHTTP2_SETTINGS_TIMEOUTNGHTTP2_ENHANCE_YOUR_CALMNGHTTP2_FLAG_ACKnghttp2_iv_checkNGHTTP2_STREAM_CLOSEDnghttp2_frame_hdnghttp2_frame_unpack_settings_payload2nghttp2_frame_unpack_priority_update_payloadorignghttp2_frame_altsvc_freeopaque_data_lenchunk_lengthnghttp2_hd_nv__compar_fn_tNGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMSnghttp2_frame_headers_payload_nv_offsetNGHTTP2_ALTSVCNGHTTP2_NV_FLAG_NONEfield_valuenghttp2_frame_unpack_window_update_payloadnghttp2_frame_unpack_goaway_payloadNGHTTP2_FLAG_END_STREAMmemmovenghttp2_origin_entryNGHTTP2_HEADERSNGHTTP2_SETTINGS_INITIAL_WINDOW_SIZEnghttp2_mem_mallocNGHTTP2_DATAnghttp2_put_uint16beNGHTTP2_NV_FLAG_NO_COPY_VALUEframehd_onlynghttp2_window_updatenghttp2_extensionNGHTTP2_SETTINGS_MAX_FRAME_SIZEuint8_tnghttp2_nvnghttp2_frame_unpack_priority_specnamelenNGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZEnghttp2_frame_iv_copynghttp2_settings_entrynghttp2_frame_extension_initnghttp2_frame_rst_stream_initnghttp2_frame_pack_originnghttp2_frame_pack_headers__int128 unsignednghttp2_datawindow_size_incrementnghttp2_frame_origin_initNGHTTP2_CANCELNGHTTP2_SETTINGS_ENABLE_PUSHnghttp2_frame.cNGHTTP2_PRIORITY_UPDATEnvlennghttp2_frame_priority_initNGHTTP2_FLAG_PADDEDNGHTTP2_REFUSED_STREAMNGHTTP2_PRIORITYNGHTTP2_HCAT_REQUESTNGHTTP2_COMPRESSION_ERRORnghttp2_priorityexclusivenewlennghttp2_frame_pack_priority_updatenghttp2_frame_unpack_priority_payloadnghttp2_priority_specnghttp2_nv_equalNGHTTP2_ORIGINframe_set_padNGHTTP2_HCAT_HEADERSfield_value_lennghttp2_frame_window_update_initNGHTTP2_FRAME_SIZE_ERRORblennghttp2_goawaynghttp2_frame_unpack_goaway_payload2nghttp2_bufs_addNGHTTP2_WINDOW_UPDATEnghttp2_put_uint32benghttp2_frame_extension_freenghttp2_rst_streamnghttp2_frame_pack_settings_payloaddeflate_hd_table_bufsize_maxnghttp2_frame_origin_freedep_stream_idNGHTTP2_PUSH_PROMISEnghttp2_frame_ping_initnghttp2_hd_ringbufnghttp2_frame_priority_freenghttp2_hd_entryNGHTTP2_SETTINGS_NO_RFC7540_PRIORITIESnghttp2_frame_unpack_push_promise_payloadframe_pack_headers_sharedNGHTTP2_CONTINUATIONbytes_comparnotify_table_size_changeNGHTTP2_PROTOCOL_ERRORnghttp2_nv_array_sortnghttp2_frame_window_update_freememcpynghttp2_frame_unpack_settings_entrynghttp2_frame_unpack_altsvc_payload2NGHTTP2_GOAWAYNGHTTP2_FLAG_END_HEADERSnghttp2_nv_array_copynghttp2_frame_pack_priorityNGHTTP2_PINGNGHTTP2_INADEQUATE_SECURITYnghttp2_hd_deflate_hd_bufsnva_ptrnghttp2_frame_pack_pingNGHTTP2_SETTINGSNGHTTP2_NO_ERRORnghttp2_nv_array_delnghttp2_frame_unpack_ping_payloadnghttp2_settingsvaluelennghttp2_frame_pack_frame_hdnghttp2_buf_chainNGHTTP2_INTERNAL_ERRORnghttp2_frame_unpack_headers_payloadNGHTTP2_CONNECT_ERRORfirstnghttp2_bufs_lenNGHTTP2_RST_STREAMnghttp2_priority_spec_default_initNGHTTP2_SETTINGS_HEADER_TABLE_SIZEqsortnghttp2_ext_priority_updatenghttp2_cpymembeginnghttp2_headers_categorymin_hd_table_bufsize_maxoriginlennghttp2_frame_add_padnghttp2_frame_priority_lennghttp2_frame_goaway_inituint16_tNGHTTP2_NV_FLAG_NO_COPY_NAMEnghttp2_frame_headers_initnghttp2_pingnghttp2_frame_trail_padlenNGHTTP2_HTTP_1_1_REQUIREDNGHTTP2_FLAG_NONEnghttp2_hd_deflaternghttp2_frame_pack_priority_specnghttp2_frame_pack_goawaychunk_usednghttp2_frame_rst_stream_freenghttp2_downcasenghttp2_frame_ping_freeNGHTTP2_FLOW_CONTROL_ERRORnghttp2_frame_settings_freenghttp2_frame_unpack_settings_payloadnghttp2_frame_hd_initorigin_lennghttp2_frame_priority_update_initnghttp2_push_promisenghttp2_headersnghttp2_bufsnghttp2_frame_pack_window_updatenghttp2_frame_unpack_frame_hdnghttp2_bufmemcmpnghttp2_frame_pack_rst_streamnghttp2_frame_pack_settingsnghttp2_frame_data_initnghttp2_ext_originhd_table_bufsizenghttp2_frame_push_promise_initnghttp2_nv_compare_namevar_gift_payloadlenNGHTTP2_HCAT_PUSH_RESPONSEnghttp2_framenghttp2_frame_goaway_freechunk_keepnghttp2_frame_headers_freenghttp2_rcbufnghttp2_frame_unpack_origin_payloadvar_gift_payloadnghttp2_ext_altsvcnghttp2_frame_priority_update_freenghttp2_frame_pack_push_promisenghttp2_frame_unpack_rst_stream_payloadreservednghttp2_get_uint16NGHTTP2_NV_FLAG_NO_INDEXnghttp2_priority_spec_initnghttp2_frame_altsvc_initnghttp2_frame_settings_initnghttp2_frame_data_freemax_chunknv_comparnghttp2_frame_unpack_altsvc_payloadnghttp2_frame_pack_altsvcnghttp2_frame_push_promise_freenghttp2_hd_contextopaque_datanghttp2_hd_mapNGHTTP2_HCAT_RESPONSEniv_ptrnghttp2_get_uint32lastcur_chainnghttp2_bufs_wrap_init2nghttp2_buf_resetnghttp2_bufs_orbnext_chainnghttp2_bufs_init2nghttp2_bufs_init3resbufnghttp2_bufs_wrap_freenghttp2_bufs_reallocnghttp2_bufs_seek_last_presentnghttp2_buf_init2head_chainbuf_chain_newnghttp2_bufs_initnghttp2_buf_freebuf_chain_delnghttp2_bufs_removeveclenptrdiff_tnghttp2_bufs_remove_copynghttp2_bufs_advanceinitialnghttp2_bufs_addbnghttp2_bufs_addb_holdbufs_alloc_chainnghttp2_buf.cnghttp2_bufs_next_presentnghttp2_vecnghttp2_bufs_wrap_initnghttp2_ssizedst_chainnwritenghttp2_buf_reservenghttp2_buf_wrap_initbufs_ensure_addbnghttp2_buf_initnghttp2_bufs_resetnghttp2_bufs_orb_holdnghttp2_bufs_freenew_capfstateNGHTTP2_HD_OPCODE_NONEnghttp2_on_invalid_frame_recv_callbacknghttp2_outbound_queueNGHTTP2_HTTP_FLAG_METH_UPGRADE_WORKAROUNDmax_frame_sizenghttp2_on_frame_recv_callback__ssize_tNGHTTP2_HD_STATE_NEWNAME_READ_NAMELENNGHTTP2_HTTP_FLAG_METH_ALLnghttp2_stream_resume_deferred_itemNGHTTP2_STREAM_FLAG_IGNORE_CLIENT_PRIORITIESnghttp2_stream_dep_add_subtreerootunlink_depNGHTTP2_IB_READ_NBYTEnghttp2_stream_promise_fulfillednghttp2_on_stream_close_callbacknghttp2_on_begin_frame_callbacknghttp2_data_sourceNGHTTP2_HD_OPCODE_INDNAMENGHTTP2_HTTP_FLAG_EXPECT_FINAL_RESPONSEnghttp2_stream_dep_distributed_weightnum_closed_streamsgoaway_flagsvaluebufNGHTTP2_IB_READ_FIRST_SETTINGSbuiltin_recv_ext_typesnghttp2_stream_statestream_seqnghttp2_hd_huff_decode_contexttargetnghttp2_on_frame_not_send_callbacknghttp2_sessionclosed_stream_tailNGHTTP2_STREAM_STATE_HALF_CLOSED_REMOTEmax_header_list_sizenghttp2_recv_callbacknghttp2_hd_inflaterob_datapending_penaltystream_obq_movenghttp2_ratelimnghttp2_headers_aux_datanghttp2_stream_dep_removenghttp2_stream_get_first_childinsert_link_depnghttp2_settings_storageNGHTTP2_HD_OPCODE_NEWNAMEshiftNGHTTP2_HD_STATE_NEWNAME_READ_NAMEHUFFNGHTTP2_HD_STATE_READ_INDEXnghttp2_stream_dep_find_ancestorNGHTTP2_IB_READ_ALTSVC_PAYLOADidle_stream_tailunlink_sibnghttp2_send_callbackwlen_penaltyNGHTTP2_OB_SEND_NO_COPYtstampNGHTTP2_HTTP_FLAG_METH_CONNECTnv_value_keepNGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROLob_urgentnghttp2_stream_update_local_initial_window_sizeserverNGHTTP2_HTTP_FLAG__PROTOCOLnghttp2_stream_dep_insertupdate_initial_window_sizenghttp2_streamNGHTTP2_HTTP_FLAG__PATHNGHTTP2_OB_SEND_DATANGHTTP2_HTTP_FLAG_BAD_PRIORITYsum_dep_weightstream_subtree_activeNGHTTP2_STREAM_OPENINGrecv_reductionnghttp2_shut_flagnew_window_sizeremote_last_stream_idnghttp2_stream_proto_statenew_initial_window_sizenghttp2_send_callback2nghttp2_stream.cnghttp2_stream_initNGHTTP2_HD_STATE_READ_TABLE_SIZENGHTTP2_IB_READ_ORIGIN_PAYLOADnghttp2_inbound_frameNGHTTP2_IB_FRAME_SIZE_ERRORnghttp2_inflight_settingsNGHTTP2_HTTP_FLAG_NONEnghttp2_stream_get_previous_siblingnghttp2_on_begin_headers_callbackNGHTTP2_IB_READ_HEADER_BLOCKstream_update_dep_on_attach_itemob_syndata_prdnghttp2_stream_get_next_siblingNGHTTP2_HTTP_FLAG_REQ_HEADERSnghttp2_stream_change_weightno_indexNGHTTP2_IB_READ_GOAWAY_DEBUGstream_lessnghttp2_outbound_statenghttp2_data_provider2nghttp2_send_data_callbackNGHTTP2_IB_READ_SETTINGSNGHTTP2_STREAM_FLAG_NONENGHTTP2_STREAM_STATE_HALF_CLOSED_LOCALnghttp2_on_header_callbacknghttp2_select_padding_callbacknghttp2_data_source_read_callback2NGHTTP2_STREAM_INITIALnv_name_keepNGHTTP2_HTTP_FLAG_PRIORITYinflight_settings_headschednghttp2_on_frame_send_callbacklhsxnghttp2_aux_dataNGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIESpending_enable_pushNGHTTP2_SHUT_RDnghttp2_stream_get_stream_idstatus_coderaw_sbufnghttp2_stream_get_weightNGHTTP2_STREAM_RESERVEDNGHTTP2_HTTP_FLAG__SCHEMEnghttp2_stream_freelast_writelenvaluercbufnghttp2_stream_attach_itemnghttp2_stream_check_deferred_itemstream_next_cyclelast_sent_stream_idNGHTTP2_HTTP_FLAG_HOSTpending_local_max_concurrent_streamNGHTTP2_STREAM_FLAG_CLOSEDNGHTTP2_OB_SEND_CLIENT_MAGICnghttp2_data_provider_wrapremote_settings_receivedobq_flood_counter_ob_regdep_streamNGHTTP2_HD_STATE_READ_VALUELENindex_requiredNGHTTP2_IB_READ_CLIENT_MAGIChttp_flagsNGHTTP2_STREAM_STATE_IDLEnamercbufold_initial_window_sizenghttp2_on_header_callback2nghttp2_ext_frame_payloadNGHTTP2_STREAM_CLOSINGNGHTTP2_HTTP_FLAG__METHODNGHTTP2_STREAM_STATE_RESERVED_REMOTEnghttp2_inbound_statemax_nivrhsxNGHTTP2_STREAM_STATE_CLOSEDnghttp2_stream_check_deferred_by_flow_controlNGHTTP2_IB_IGN_CONTINUATIONnghttp2_stream_get_parentNGHTTP2_STREAM_FLAG_DEFERRED_ALLnghttp2_data_providerNGHTTP2_HTTP_FLAG__STATUSinitial_statenghttp2_on_data_chunk_recv_callbackNGHTTP2_STREAM_IDLEnext_unique_idNGHTTP2_IB_EXPECT_CONTINUATIONNGHTTP2_STREAM_STATE_RESERVED_LOCALclosed_nextNGHTTP2_SHUT_WRclosed_prevclosed_stream_headnghttp2_on_invalid_header_callbackset_dep_prevNGHTTP2_IB_IGN_PAYLOADhuff_decode_ctxNGHTTP2_IB_READ_DATAdep_nextstream_update_dep_on_detach_itempayloadleftmax_incoming_reserved_streamspending_no_rfc7540_prioritiesqnextnghttp2_stream_get_statenghttp2_ext_aux_datanghttp2_error_callback2nghttp2_outbound_itemNGHTTP2_HTTP_FLAG_METH_OPTIONSnghttp2_goaway_aux_datanghttp2_data_source_read_length_callbackNGHTTP2_SHUT_NONENGHTTP2_HD_STATE_CHECK_VALUELENidle_stream_headnghttp2_stream_next_outbound_itemdescendant_next_seqNGHTTP2_STREAM_FLAG_DEFERRED_USERopt_flagsnghttp2_session_callbacksdescendant_last_cyclenghttp2_select_padding_callback2nghttp2_stream_rescheduleframebufsnum_continuationsnghttp2_on_invalid_header_callback2NGHTTP2_IB_READ_PAD_DATAnamebufwindow_update_queuedNGHTTP2_HD_STATE_READ_VALUEuser_recv_ext_typesNGHTTP2_STREAM_OPENEDhttp_extpriNGHTTP2_HD_STATE_NEWNAME_CHECK_NAMELENstream_activenghttp2_error_callbackNGHTTP2_IB_IGN_DATAnghttp2_stream_detach_itemnghttp2_stream_update_remote_initial_window_sizenghttp2_stream_in_dep_treeNGHTTP2_HTTP_FLAG_METH_HEADNGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATIONNGHTTP2_STREAM_FLAG_PUSHnum_incoming_streamsNGHTTP2_HD_STATE_EXPECT_TABLE_SIZEdestNGHTTP2_IB_IGN_ALLnghttp2_stream_shutdownNGHTTP2_SHUT_RDWRNGHTTP2_HD_STATE_NEWNAME_READ_NAMEnghttp2_stream_get_sum_dependency_weightNGHTTP2_IB_READ_EXTENSION_PAYLOADsib_nextnum_incoming_reserved_streamspending_enable_connect_protocolsum_dep_weight_deltaNGHTTP2_HTTP_FLAG_PATH_ASTERISKNGHTTP2_HD_STATE_INFLATE_STARTNGHTTP2_HTTP_FLAG__AUTHORITYuint64_tnghttp2_on_extension_chunk_recv_callbacksettings_hd_table_bufsize_maxNGHTTP2_IB_IGN_HEADER_BLOCKNGHTTP2_HTTP_FLAG_PATH_REGULARstream_obq_removeNGHTTP2_STREAM_STATE_OPENstream_obq_pushstream_last_sibcanceledNGHTTP2_OB_POP_ITEMnghttp2_data_source_read_length_callback2last_recv_stream_idnghttp2_unpack_extension_callbackNGHTTP2_HD_OPCODE_INDEXEDvalidate_treenghttp2_stream_dep_insert_subtreenghttp2_active_outbound_itemnghttp2_stream_defer_itemraw_lbufno_copynghttp2_pack_extension_callback2nvbuflenbuiltinNGHTTP2_HD_STATE_READ_VALUEHUFFnghttp2_stream_dep_remove_subtreenum_outgoing_streamslocal_last_stream_idNGHTTP2_HD_STATE_OPCODEnum_idle_streamsshut_flagsnghttp2_data_aux_dataiframesib_prevnghttp2_hd_opcodeNGHTTP2_HTTP_FLAG_PSEUDO_HEADER_DISALLOWEDnghttp2_data_source_read_callbackrecv_content_lengthNGHTTP2_IB_READ_HEADNGHTTP2_HTTP_FLAG_SCHEME_HTTPnghttp2_recv_callback2nghttp2_before_frame_send_callbacknghttp2_hd_inflate_stateold_weightnghttp2_stream_dep_addnghttp2_pack_extension_callbacknghttp2_outbound_queue_popnghttp2_data_provider_wrap_v1nghttp2_data_provider_wrap_v2nghttp2_outbound_queue_initnghttp2_outbound_item.cnghttp2_outbound_queue_pushnghttp2_outbound_item_freenghttp2_outbound_item_initnghttp2_session_sendnghttp2_hd_deflate_get_dynamic_table_sizesession_call_error_callbacknghttp2_submit_settingsnghttp2_session_get_remote_settingsadditionalNGHTTP2_GOAWAY_RECVnghttp2_session_client_new2nghttp2_session_client_new3session_enforce_http_messagingsession_process_priority_update_framenghttp2_hd_deflate_change_table_sizenghttp2_session_want_writeinbound_frame_set_settings_entrysession_process_extension_framepri_spec_innghttp2_session_on_altsvc_receivedopaque_data_copyoverflow_arg_areanghttp2_session_add_goawaynghttp2_session_on_request_headers_receivednghttp2_hd_deflate_init2reg_save_areasession_update_stream_prioritynghttp2_session_enforce_flow_control_limitssession_on_data_received_fail_fastnghttp2_session_add_rst_streamnghttp2_session_set_stream_user_datanbuffersession_process_goaway_framesettings_ptrsession_detect_idle_streamsession_predicate_push_response_headers_sendhd_proclensession_detach_stream_itemsession_trailer_headersnghttp2_http_on_request_headersconsumed_size_ptrsession_handle_invalid_stream2NGHTTP2_OPT_SERVER_FALLBACK_RFC7540_PRIORITIESfind_stream_on_goaway_funcsession_predicate_push_promise_sendnghttp2_session_get_hd_inflate_dynamic_table_sizenghttp2_session_get_effective_recv_data_lengthNGHTTP2_OPT_STREAM_RESET_RATE_LIMITdebug_datadebug_datalensession_update_connection_consumed_sizenghttp2_http_on_data_chunksession_update_local_initial_window_sizesession_predicate_headers_sendmin_header_table_size_entry__va_list_tagnghttp2_session_on_origin_receivednghttp2_session_get_remote_window_sizenghttp2_session_server_newrecv_window_size_ptrhead_requestold_window_sizepri_spec_copyNGHTTP2_ERR_CREDENTIAL_PENDINGu8extprisession_process_priority_framenghttp2_session_next_data_readcall_header_cbreadlen_ptrsession_process_data_framesession_pack_extensionvsnprintfnghttp2_session_delinit_settingssession_after_frame_sent1session_after_frame_sent2__gnuc_va_listnghttp2_http_on_trailer_headersNGHTTP2_DATA_FLAG_NO_END_STREAMnghttp2_hd_inflate_get_dynamic_table_sizenghttp2_session_on_priority_update_receivednghttp2_session_on_rst_stream_receivednghttp2_session_is_my_stream_idnghttp2_session_get_next_stream_idpq_get_first_cycleNGHTTP2_OPTMASK_NO_HTTP_MESSAGINGnghttp2_session_get_stream_rawupdate_remote_initial_window_size_funcnghttp2_session_create_idle_streamsession_attach_stream_itemnghttp2_session_terminate_sessionNGHTTP2_ERR_IGN_HTTP_HEADERNGHTTP2_GOAWAY_AUX_NONEsession_get_num_active_streamsnghttp2_session_predicate_data_sendsession_after_header_block_receivedinflight_settings_newnghttp2_ratelim_initsession_predicate_window_update_sendnghttp2_session_get_stream_user_datanghttp2_settings_idsession_call_on_begin_headerssession_call_on_extension_chunk_recv_callbackstream_reset_burstnghttp2_session_add_window_updatenghttp2_session_consume_streamsession_update_consumed_sizeNGHTTP2_OPTMASK_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATIONnghttp2_session_reprioritize_streamsession_process_altsvc_frameinflight_settings_delsession_update_stream_reset_ratelimNGHTTP2_DATA_FLAG_NO_COPYno_rfc7540_pringhttp2_http_parse_prioritynghttp2_session_terminate_session_with_reasonsession_predicate_for_stream_sendpri_spec_defaultnghttp2_submit_data_sharedNGHTTP2_TYPEMASK_NONEnext_readmaxsession_inbound_frame_resetNGHTTP2_HD_INFLATE_EMITopened_stream_idnghttp2_session_on_headers_receivednghttp2_session_consumenghttp2_session_recvdata_flagssession_call_before_frame_sendNGHTTP2_HD_INFLATE_FINALnghttp2_session_adjust_idle_streampadded_payloadlensession_is_outgoing_concurrent_streams_maxcont_hdNGHTTP2_GOAWAY_TERM_SENTnghttp2_http_on_headernghttp2_session_close_streamextpri_innghttp2_http_on_remote_end_streamfast_cbsession_update_remote_initial_window_sizefailure_reasonignore_client_signalNGHTTP2_OPT_MAX_DEFLATE_DYNAMIC_TABLE_SIZEincomingnghttp2_session_detach_idle_streamnghttp2_session_upgrade_internalnghttp2_hd_inflate_end_headerssession_sched_get_next_outbound_itemNGHTTP2_DATA_FLAG_EOFnghttp2_session_check_server_sessionurgencyNGHTTP2_GOAWAY_SENTstream_reset_ratesession_process_origin_framedatamaxnghttp2_session_change_extpri_stream_priorityframelennghttp2_session_server_new2nghttp2_session_server_new3nghttp2_hd_inflate_freenghttp2_session_consume_connectionsession_handle_invalid_connectionNGHTTP2_DATA_FLAG_NONEnghttp2_session_get_stream_local_closesession_ptrsession_call_unpack_extension_callbackupdate_local_initial_window_size_funcfail_sessiondata_readlenNGHTTP2_OPT_NO_AUTO_PING_ACKnghttp2_session_want_readsession_predicate_response_headers_sendnghttp2_session_add_itemactive_outbound_item_resetinbound_frame_handle_padnoackob_q_freesession_handle_frame_size_errornghttp2_session_get_local_window_sizesession_defer_stream_itemNGHTTP2_OPT_NO_CLOSED_STREAMSnghttp2_session.csession_predicate_altsvc_sendnghttp2_session_get_stream_local_window_sizenghttp2_time_now_secsession_call_on_frame_receivedstatic_inNGHTTP2_OPT_MAX_CONTINUATIONSfree_streamssession_ob_data_removeon_begin_frame_calledNGHTTP2_OPT_NO_AUTO_WINDOW_UPDATEsession_ob_data_pushsession_estimate_headers_payloadNGHTTP2_TYPEMASK_ORIGINNGHTTP2_OPTMASK_NO_AUTO_PING_ACKnghttp2_session_destroy_streamfail_aob_framebufnghttp2_session_mem_sendrequested_window_sizefp_offsetprev_streamsession_end_stream_headers_receivedgp_offsetnghttp2_session_get_last_proc_stream_idsession_prep_frameinflate_flagssession_call_on_invalid_headersession_sched_reschedule_streamnghttp2_session_on_push_response_headers_receivedstate_reserved_remoteNGHTTP2_OPT_BUILTIN_RECV_EXT_TYPESnghttp2_session_on_data_receivednghttp2_session_get_stream_effective_recv_data_lengthsession_reschedule_streamnghttp2_session_get_stream_remote_window_sizeNGHTTP2_OPT_USER_RECV_EXT_TYPESis_non_fatalsession_handle_invalid_streamNGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMSsession_headers_add_padnghttp2_ratelim_updatesettings_payloadlennghttp2_close_stream_on_goaway_argNGHTTP2_OPT_NO_RECV_CLIENT_MAGICsession_is_closinginbound_frame_payload_readlennghttp2_update_window_size_argnghttp2_session_set_next_stream_idnghttp2_session_get_hd_deflate_dynamic_table_sizenghttp2_session_pack_datanghttp2_hd_deflate_freeNGHTTP2_OPTMASK_NO_CLOSED_STREAMSnghttp2_session_get_outbound_queue_sizesession_process_settings_framenghttp2_session_get_stream_effective_local_window_sizenghttp2_extpri_to_uint8nghttp2_session_get_effective_local_window_sizenghttp2_session_on_ping_receivedstream_allocsession_is_new_peer_stream_idsession_predicate_origin_sendnghttp2_extpri_from_uint8session_call_on_begin_framesession_on_stream_window_update_receivedestimated_payloadlendata_ptrnghttp2_session_keep_idle_streamnghttp2_session_on_goaway_receivedmin_header_size_entrysession_process_ping_framesession_process_rst_stream_framenghttp2_session_terminate_session2session_process_window_update_framesession_call_on_headersentlensubject_streamnghttp2_session_pop_next_ob_itemnghttp2_session_get_next_ob_itemsession_process_push_promise_framenghttp2_session_check_request_allowedstream_closedsession_predicate_priority_update_sendnghttp2_session_on_response_headers_receivedpri_fieldlensession_close_stream_on_goawaynghttp2_session_upgrade2nghttp2_session_get_root_streamNGHTTP2_ERR_IGN_HEADER_BLOCKNGHTTP2_GOAWAY_SUBMITTEDsession_update_stream_consumed_sizestrlenNGHTTP2_GOAWAY_AUX_SHUTDOWN_NOTICEnghttp2_session_close_stream_if_shut_rdwrnghttp2_hd_inflate_initnghttp2_session_update_local_settingssession_predicate_request_headers_sendsession_inflate_handle_invalid_connectionnghttp2_session_keep_closed_streamNGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATEsession_is_incoming_concurrent_streams_maxNGHTTP2_OPT_MAX_SEND_HEADER_BLOCK_LENGTHinbound_frame_set_markNGHTTP2_TYPEMASK_ALTSVCsession_no_rfc7540_pri_no_fallbacknum_stream_maxnghttp2_ratelim_drainnghttp2_session_update_recv_connection_window_sizesession_on_connection_window_update_receivedNGHTTP2_OPT_NO_HTTP_MESSAGINGnghttp2_session_mem_send_internalNGHTTP2_GOAWAY_TERM_ON_SENDsession_call_on_frame_sendsession_call_on_invalid_frame_recv_callbacksession_call_select_paddingnghttp2_session_on_priority_receivedmax_paddedlennghttp2_session_adjust_closed_streamnghttp2_session_change_stream_prioritystate_reserved_localdebuglennghttp2_session_find_streamnghttp2_session_update_recv_stream_window_sizepublic_data_frameget_error_code_from_lib_error_codenghttp2_session_mem_recv2adjust_recv_window_sizenghttp2_hd_inflate_hd_nvpromised_streamnghttp2_session_on_settings_receivedinbound_frame_effective_readleninflate_header_blockinbound_frame_compute_padsession_call_send_dataNGHTTP2_OPT_MAX_SETTINGSnghttp2_session_get_stream_remote_closecheck_ext_type_setNGHTTP2_OPT_MAX_OUTBOUND_ACKmin_header_table_sizenghttp2_hd_inflate_change_table_sizesession_resume_deferred_stream_itemnghttp2_session_upgradesession_allow_incoming_new_streamnghttp2_session_client_newnghttp2_optionsession_append_inflight_settingsnghttp2_session_resume_datanghttp2_session_mem_recvnghttp2_session_on_push_promise_receivedfail_hd_deflateropt_set_masksession_sched_emptynghttp2_http_on_response_headersnghttp2_session_set_user_datainbound_frame_buf_readaux_flagssession_inflate_handle_invalid_streamnghttp2_session_mem_send2max_payloadlennext_streamnghttp2_enable_strict_prefaceNGHTTP2_OPTMASK_SERVER_FALLBACK_RFC7540_PRIORITIESnghttp2_session_add_settingsnghttp2_session_get_local_settingsfail_hd_inflaterdelta_sizenghttp2_mem_defaultnghttp2_http_record_request_methodNGHTTP2_TYPEMASK_PRIORITY_UPDATEheader_table_size_seennghttp2_extprisession_is_incoming_concurrent_streams_pending_maxhead_streamnghttp2_session_add_pingnghttp2_priority_spec_normalize_weightpausenghttp2_is_fatalnghttp2_hd_deflate_boundnghttp2_session_get_extpri_stream_prioritynghttp2_should_send_window_updateNGHTTP2_OPT_MAX_RESERVED_REMOTE_STREAMSrecv_sizeNGHTTP2_GOAWAY_AUX_TERM_ON_SENDNGHTTP2_HD_INFLATE_NONENGHTTP2_GOAWAY_NONENGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATIONNGHTTP2_ERR_IGN_PAYLOADbusyNGHTTP2_OPTMASK_NO_RECV_CLIENT_MAGICnghttp2_session_open_streamsession_process_headers_framenghttp2_session_get_streamsession_newnghttp2_session_on_window_update_receivedNGHTTP2_ERR_REMOVE_HTTP_HEADERnghttp2_submit_pingnghttp2_submit_data2nghttp2_submit_goawaynghttp2_adjust_local_window_sizenghttp2_submit.cnghttp2_submit_trailernghttp2_submit_rst_streamnghttp2_increase_local_window_sizesubmit_headers_sharednghttp2_submit_shutdown_noticenghttp2_submit_altsvcset_response_flagssubmit_request_sharednghttp2_submit_requestnghttp2_submit_headersset_request_flagsnghttp2_priority_spec_check_defaultnghttp2_submit_request2detect_self_dependencynghttp2_submit_responsepromised_stream_user_datanflagsorigin_copyfail2field_value_copynghttp2_submit_response2nghttp2_pack_settings_payloadov_copycopy_pri_specsubmit_response_sharedfail_item_mallocnghttp2_submit_push_promisenghttp2_submit_prioritysubmit_headers_shared_nvanghttp2_submit_window_updatenghttp2_pack_settings_payload2hcatnva_copynghttp2_submit_originflags_copynghttp2_session_set_local_window_sizenghttp2_submit_datanghttp2_submit_priority_updatenghttp2_submit_extensionVALID_HD_NAME_CHARSnghttp2_helper.cnew_recv_window_sizenghttp2_http2_strerrornghttp2_check_path__bsxnghttp2_check_methodnghttp2_check_header_value_rfc9113VALID_AUTHORITY_CHARSrecv_reduction_deltalocal_window_size_ptrnghttp2_check_header_valuenghttp2_check_header_nameVALID_HD_VALUE_CHARSnghttp2_check_authority__bswap_32nghttp2_strerrorrecv_reduction_ptrDOWNCASE_TBLVALID_METHOD_CHARSVALID_PATH_CHARSdelta_ptrnghttp2_alpn.ckeylennghttp2_select_next_protocoloutlennghttp2_select_alpnnghttp2_hd_huff_decode_context_initsearch_hd_tablestartnghttp2_hd_deflate_newnghttp2_hd_inflate_hd2nghttp2_hd_inflate_hd3hd_ringbuf_push_frontrfinnghttp2_hd_decode_lengthnghttp2_hd_deflate_new2NGHTTP2_TOKEN_AUTHORIZATIONnghttp2_hd_inflate_get_table_entrymemeqnghttp2_hd_inflate_hdNGHTTP2_TOKEN_ACCEPT_LANGUAGENGHTTP2_TOKEN_IF_UNMODIFIED_SINCEnghttp2_hd_inflate_get_num_table_entrieshd_inflate_set_huffman_encodednext_bufsizebufphd_inflate_keep_freeNGHTTP2_TOKEN_ACCESS_CONTROL_ALLOW_ORIGINin_finalNGHTTP2_TOKEN_CONTENT_LOCATIONhd_ringbuf_pop_backsettings_max_dynamic_table_sizehd_ringbuf_getNGHTTP2_TOKEN_PROXY_AUTHENTICATENGHTTP2_TOKEN_LINKhd_ringbuf_freehd_map_inithd_inflate_read_lenNGHTTP2_TOKEN_CONTENT_TYPENGHTTP2_TOKEN_TENGHTTP2_TOKEN_UPGRADEname_value_matchnghttp2_hd_deflate_initNGHTTP2_TOKEN_COOKIENGHTTP2_TOKEN__PROTOCOLdeflater_ptrhd_inflate_readnghttp2_hd_deflate_get_table_entryhd_context_shrink_table_sizenghttp2_hd_emit_newname_blocknghttp2_hd_huff_encode_countnghttp2_hd_inflate_delnghttp2_hd_deflate_hd_vec2emit_indexed_blockNGHTTP2_TOKEN_STRICT_TRANSPORT_SECURITYNGHTTP2_TOKEN_CONNECTIONnghttp2_hd_inflate_newnghttp2_hd_entry_initenclennghttp2_hd_deflate_get_num_table_entriesNGHTTP2_TOKEN__AUTHORITYNGHTTP2_TOKEN_TRANSFER_ENCODINGNGHTTP2_TOKEN__PATHnghttp2_hd_deflate_get_max_dynamic_table_sizeNGHTTP2_TOKEN_REFERERprefixNGHTTP2_TOKEN_CONTENT_LENGTHNGHTTP2_TOKEN_CACHE_CONTROLname_hashencode_lengthNGHTTP2_TOKEN_IF_MATCHNGHTTP2_TOKEN_ACCEPT_RANGESNGHTTP2_HD_WITH_INDEXINGexact_matchNGHTTP2_TOKEN_SERVERhd_inflate_read_huffNGHTTP2_TOKEN_ETAGinflater_ptrnghttp2_hd_deflate_hd_vechd_map_removeNGHTTP2_TOKEN_WWW_AUTHENTICATEhd_context_initNGHTTP2_TOKEN_PROXY_CONNECTIONnghttp2_hd_inflate_get_max_dynamic_table_sizeNGHTTP2_TOKEN_MAX_FORWARDSNGHTTP2_HD_NEVER_INDEXINGemit_stringnghttp2_hd_entry_freeNGHTTP2_TOKEN_AGEpack_first_byteNGHTTP2_TOKEN_EXPECTNGHTTP2_TOKEN_ACCEPTmaxlenNGHTTP2_TOKEN_ACCEPT_ENCODINGNGHTTP2_TOKEN_EXPIRESNGHTTP2_TOKEN_ACCEPT_CHARSETNGHTTP2_TOKEN_IF_NONE_MATCHNGHTTP2_TOKEN_HOSTnghttp2_hd_huff_decodeNGHTTP2_TOKEN_USER_AGENTNGHTTP2_TOKEN_IF_RANGEindexing_modeNGHTTP2_TOKEN_LOCATIONnghttp2_hd.chd_map_inserthd_ringbuf_initNGHTTP2_TOKEN_PRIORITYhd_context_freenghttp2_hd_emit_indname_blockname_eqnghttp2_hd_huff_decode_failure_statelookup_tokennew_ententry_roomadd_hd_table_incrementalnghttp2_hd_emit_table_sizeNGHTTP2_TOKEN_FROMnv_outNGHTTP2_TOKEN_DATEname_onlyNGHTTP2_TOKEN_CONTENT_DISPOSITIONalmost_okNGHTTP2_TOKEN_SET_COOKIENGHTTP2_TOKEN_KEEP_ALIVENGHTTP2_TOKEN_VARYblocklennghttp2_hd_deflate_hd2nghttp2_hd_huff_encodeNGHTTP2_TOKEN_REFRESHNGHTTP2_TOKEN_VIAcount_encoded_lengthhd_deflate_decide_indexingnghttp2_rcbuf_new2nghttp2_hd_table_getget_max_indexprefixlenhd_map_findnghttp2_hd_static_entryhd_inflate_commit_indexedNGHTTP2_TOKEN_IF_MODIFIED_SINCEhuffmanNGHTTP2_HD_WITHOUT_INDEXINGNGHTTP2_TOKEN_CONTENT_LANGUAGEemit_headernghttp2_rcbuf_decrefnghttp2_hd_deflate_hdnghttp2_rcbuf_increfNGHTTP2_TOKEN__SCHEMEhd_ringbuf_reservenghttp2_rcbuf_newdeflate_nvsearch_resultNGHTTP2_TOKEN_CONTENT_RANGEhd_inflate_commit_newnamenghttp2_hd_table_get2shift_ptrNGHTTP2_TOKEN__METHODvalue_eqsearch_static_tablehd_get_table_entryNGHTTP2_TOKEN_RANGENGHTTP2_TOKEN_RETRY_AFTERNGHTTP2_TOKEN_PROXY_AUTHORIZATIONNGHTTP2_TOKEN_CONTENT_ENCODINGNGHTTP2_TOKEN_LAST_MODIFIEDnghttp2_hd_inflate_new2NGHTTP2_TOKEN__STATUSnghttp2_hd_deflate_delhd_inflate_commit_indnameNGHTTP2_TOKEN_ALLOWhuff_decode_tablehuff_sym_tableNGHTTP2_HUFF_ACCEPTEDnghttp2_hd_huffman.cnodeNGHTTP2_HUFF_SYMsrclennghttp2_huff_decodeavailnghttp2_huff_symnghttp2_hd_huffman_data.cversion_numproto_strleast_versionnghttp2_infonghttp2_versionversion_strnghttp2_version.cnghttp2_priority_spec.cnghttp2_option_set_peer_max_concurrent_streamsnghttp2_option_set_max_reserved_remote_streamsnghttp2_option_set_max_send_header_block_lengthnghttp2_option_set_no_http_messagingnghttp2_option_set_max_continuationsnghttp2_option_set_max_deflate_dynamic_table_sizenghttp2_option_delnghttp2_option_set_no_closed_streamsnghttp2_option_set_max_outbound_acknghttp2_option.cnghttp2_option_newnghttp2_option_set_max_settingsnghttp2_option_set_stream_reset_rate_limitnghttp2_option_set_server_fallback_rfc7540_prioritiesset_ext_typenghttp2_option_set_no_auto_window_updatenghttp2_option_set_no_recv_client_magicnghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validationnghttp2_option_set_user_recv_extension_typenghttp2_option_set_no_auto_ping_acknghttp2_option_set_builtin_recv_extension_typeoption_ptrnghttp2_session_callbacks_set_on_invalid_header_callback2nghttp2_session_callbacks_set_before_frame_send_callbacknghttp2_session_callbacks_set_send_callbacknghttp2_session_callbacks_set_on_extension_chunk_recv_callbacknghttp2_session_callbacks_set_on_frame_send_callbacknghttp2_session_callbacks_set_on_begin_frame_callbacknghttp2_session_callbacks_newnghttp2_session_callbacks_delnghttp2_session_callbacks_set_error_callbacknghttp2_session_callbacks_set_on_stream_close_callbacknghttp2_session_callbacks_set_on_begin_headers_callbacknghttp2_session_callbacks_set_on_frame_not_send_callbacknghttp2_session_callbacks_set_unpack_extension_callbacknghttp2_session_callbacks_set_send_callback2callbacks_ptrnghttp2_session_callbacks_set_recv_callback2nghttp2_session_callbacks_set_pack_extension_callback2nghttp2_session_callbacks_set_on_data_chunk_recv_callbacknghttp2_session_callbacks_set_data_source_read_length_callbacknghttp2_session_callbacks_set_on_frame_recv_callbacknghttp2_session_callbacks_set_pack_extension_callbacknghttp2_session_callbacks_set_send_data_callbacknghttp2_callbacks.cnghttp2_session_callbacks_set_select_padding_callback2nghttp2_session_callbacks_set_on_header_callback2nghttp2_session_callbacks_set_select_padding_callbacknghttp2_session_callbacks_set_recv_callbacknghttp2_session_callbacks_set_on_invalid_frame_recv_callbacknghttp2_session_callbacks_set_data_source_read_length_callback2nghttp2_session_callbacks_set_error_callback2nghttp2_session_callbacks_set_on_invalid_header_callbacknghttp2_session_callbacks_set_on_header_callbackdefault_callocnmembdefault_mallocdefault_freedefault_reallocnghttp2_mem.cfree_funcnghttp2_mem_free2nghttp2_http.cSF_TYPE_INTEGERSF_TYPE_BOOLEANsf_parsersf_typehttp_response_on_headersf_decimalSF_TYPE_TOKENsf_parser_dictexpect_response_bodysf_valuecheck_pseudo_headerSF_TYPE_DECIMALsf_veccheck_schemeSF_TYPE_INNER_LISTSF_TYPE_STRINGhttp_request_on_headermemieqsf_parser_initSF_TYPE_DATEintegerparse_uintSF_TYPE_BYTESEQdenomnumernghttp2_rcbuf_get_bufrcbuf_ptrnghttp2_rcbuf.cnghttp2_rcbuf_is_staticnghttp2_rcbuf_delnghttp2_extpri.cnghttp2_extpri_parse_prioritynghttp2_ratelim.cgaintv_nsectimespecclock_gettime__time_ttv_secnghttp2_time.c__clockid_t__syscall_slong_tnghttp2_set_debug_vprintf_callbacknghttp2_debug_vprintf_callbacknghttp2_debug.cparser_byteseqparser_numberslenmemchrparser_eofparser_set_op_statesf_parser_listparser_skip_inner_listparser_dateparser_dict_valueis_wssf_parser_inner_listparser_bare_itemparser_stringsf_unescapedest_valueparser_tokenparser_skip_paramssfparse.cdest_keyparser_keysf_parser_itemfposparser_unset_inner_list_stateindex_tblsignparser_discard_spsf_base64decodeparser_discard_owssf_parser_paramparser_booleanparser_next_key_or_itemUt\twUTCVCHSHlVHSSlSH\HVHS2HP2<Q<@rU\UT^qr^0 ~1$ v"v~1$ ~1$ v"VVS^S\S^qrPQr@HUHXSXYU`}U}SUS`}T}\TT\P6U67U@hUhSUUSUSUUSUUS@lTlTTTTT CUCt\t{U{\U CTCz_z{T{_T CQCx^x{Q{^Q C0CWVWbvblV{SsS C0Cl]{]UVUV UT]T ]  TQ\Q \  Q0S0T0TQQR:\:BqBKSK\\qBXBKZKXBYBK[KYOPOVpVPP0004ZBKTKZ%YQ`Q QQ R0\0R0Km0K^0KO0KQ0KS4KZ4K[0YQkQ0OPOVpkP0iQkQ0iSkSq\qUD^DEUEk^T@\@ETEk\QB]BEQEk]0&SLkSP>VEJPJkVRs 4$t"PLjPUPUPUV UT ]  TQ \  Q0Ss 4$v"P3U3eVejU3T3]\]jT3Q3]]]jQQUP$303]S3Bs 4$v"BPPpUV Up0SQsSPPs 4$v"q 4$v"vQRRUR|S|USUSUU0T0\T\T\TT'Q'}V}QVQVQVSZPr{PPZ{\UMUMSU(Q(/q/MQX$U$9tyr% 4${"9CUEMU0CYEMYMS0uU# tyQM tyMTX$U$Btyr% 4${"EMU(Q(/qEMQuU#uUx$uEMu`TTPpP P .X.EQEkXkQ.P.EXEMPhXQ{q"QQ{TT`0Yluul} ty}P ty ty TylTTTQ{q"QQ{TPp.Puuuq{q"qQ{T.X.EQEXEt.E0X0X{TUSUU4U U #S#+U,2S #S'2S@MUM~S~USUS@UTUVTVUVVyPPUPUUUUUUPPPuUU CUCMUU*U*:U:LUL^U^_UT*T*6T6:Q:LTLZTZ^Q^_TQP*Q*:P:LQL^P^_QR*R*:R:LRL^R^_R)P*:R:LR*:P:LQ*6T6:Q:LT*:U:LU;KP`{U{SUSU`xTxVTVTPPVTSUUSu{UTVTQQ5rXzssOSL\USUTVT lUlpuhpqU pTpqT pQpqQ pRpqR pXpqX pYpqY bbpPpqUUTPTTPTu(T0:U:?U07T7>P>?TpzUzUpwTw~P~TswTw~P~Tpzuz~TxP U UTPT@STSXTry"#PuUUUTQTQPPGeP 000CRei0 00ei0Ce0Ce<CeRCeUpUUUpTQTQtPPrPuUUUTQTQPP 2U2JSJLU .T.KVKLTPqUq]UU ]  U ]0U0:]PTVQTV T V)T):TPyQyUQ5Q5:QP Pss sqTVQTV T VqPv @GUGnVnwUwxU@STSmSmxTTl p lwPTms  $0.mwT  $0.Tm s#mqq#qwQUSUSTTTTUUUU.U.8UTVTTT'T'8Ts8s@DUDHupHIU@HTHITPxUxUUUUUPTVTTTTT_ssUSUTT  U ? S? D szD S S  T \ T  Q [ ][ \ Q  0 + \+ D |D I \` U U U U` T V T T Tx s U  S  U  T  V  T Y UY c ]c d Ud s Us ] U ] 7 T7 a \a d Td \ T \ > Q> _ V_ d Qd V Q V Y RY d Rd w Rw R Y XY d Xd w Xw X 0 S s S vQ6 vQ tQ vQ6 U E VE N UN O UO \ V\ _ U_ t Ut ~ V T J \J N QN O TO ^ \^ _ T_ m Tm ~ T Q  U _ Q_ y Qy ~ Q & PO Z  D sO [ s U S U T T U U  U  U 2 U2 < U T V T T  T + T+ < T s < sP k Uk \ U U \P s Ts V T T T Pg s U  S % U T V % T Q " \" % U# R $ ]$ % U# 0 G UG h \h u Uu \ U \0 J TJ h Vh u Tu V T V0 N QN h sh u Qu Q0 N RN h Rh u Ru RO b Pu X PD h S S U U U UU'U T V T T TT'T s's07U7ESEFU0;T;FTPU\UU#\PTTT#TPPP"P^v#v[S#S08U8NU0>Q>Np48Q8NUPlUl\U\PTVTVPQw@wPRHPSrPS]]^Sr]\RSPr U UUU)T)]TT]||^^JwS*505BVBFSFmvmwVUU&U&&UTT&T&]T]T&]QQ&Q&&QRw&R&w w &w^^^&^]]&T&G_GKUKO~O_]U}~]T]&_]]STQ"S}Q"TQ"&S^P^&3POPVVP\|p\!P!&\0&0&V&V0&0&h\k\q|"T|"0[U[\UU\0cTcTTTPP>ss;VVU%U%:U:DUT \ T\$||$%T%3T3DTQ V QV"v"%Q%?Q?DV S!SPlUl\UPiTiTPpQpQqP^ST3$UVUUfVT\TTf\pvUv}P}~UpyTy}U}~TUUTTUUTT U ;];U2U29]T=S=T2T29SQ^Q2Q29^$R$R2R29R8=0=g]gk}k]808\900Xx|"$T205=P=V@NUNU@N0NsPyPPU\U\qUq{UT/\/8T8\\\jTj{TQ1V18Q8\V\vQv{VR/^/8R8\^\cRc{R/s8{s/s8\sR/^8\^/V8\V8\] p8% v"0<U<LSLMU0?T?CUCMTPhUhiSioUoSUSPhTo}T}TQ\\PhQhoQoQUQPUsUPchRosRssx U  U T  T Q  Q!U!{V{~U~VT}\}~T~\)Q)zSz~Q~S>ySS>y\\>HpHtUUSUSUSSUP0KTKQu`USUU`T]TT`Q^QQ`R\RR`XVXX`Y_YYPUUTTQQRXRXYX U U T T Q Q R  Y R R  Y R,U,p]pqU%,S,3\3YSY^\,3\>^\,3V>^V,3S>^S,3s>^sUSUTVTPL U nSntUtST8V8ApAis#itTt{V{pVQq\qtQt\Rs]stRt]APAistP"i\t\"8V8ApAis#t{V{p"ApAis#tpUg\glUlUU\TSZlTlxTxTSQi]ilQlvQv~]~Q]Rk^klRlRR^0l0P.P._SHSP'S'.P._SlH[_[Xz!zpp.p._sUUUQPQPQQ'Q 0 %P%'00AUAv]vyUy]U0ATAT0AQAqSySSlyPbkPkt\yP\JrvyvAx^y^USUSTTTTppPU S !U!CST!T!0T0CT p!0p1=PPfUfxSxyUySPfTfyTyTT\fqyqPUSUSTTTTqqP(U(.V.3U3<U<PVPUUV(T(3T3?T?\TT\0(S3SP0SP(P3CPPVPuUovJUPU]TP]LUPPPPUj]]]Pjk ]]]k]]]P ]]]TTTUU UTT TSsPPSQQ S0V 0 $ U$ V U V U V S ] S ]$ R UR y P P S ] S ] U v! - X- C xC R QR g qg y Q Q X- R uR t p \ \ S S s s  U  U ' P' + u+ 2 P2 3 uUVυPυ"VTSwSυVυ!SP#Pυv̅Sυ!SPs8$s "@`U`duxdrU\`U`duxdmUUVS"SVPV"V0VUVSU0KTK\U#0_Q_Q0cRc]U#0cXc^U#0cYc_U#UuxU߈U߈VKSKTVYxS؈߈V߈POVOTP<v߈STSP$s8$s "ʼnUʼnSSS\T\]UTuʼnTʼn։s։]TVʼnTVTX}xX\ux9st)r)\ʼn\<RTSs8$S\t8$SSS\T\]UOT`gTgp tup|P|} tuUSUڊSڊފUފSTTTÊsÊފTފTT T TڊSڊފUĊފP EUEFSFGUGaSaeUefUGaSaeUefUpUSUSUU͋SpTTT͋TSUUЋUTUU'UЋ܋T܋TT'TUTUTƌTQƌQЌTTЌQQ0IUI^U`U\U\`TVTVSSƍSƍ\ƍV RURSU RTRST5DTMRTRST5DUMRURSU<DP<DTDMTDMU`UV|xUVUV %P%.vǏP{SSS{]]]͎S͎V|xU͎^spv׎PV|xU.|V1KV.JPJhqh|v#p1KP5KQ2hQh|v15Q5Kv;hQh|v;JPJhqh|v#p?aR?JQJhPh|QՏ1VKVُPqKPTiQݏQKOQO`viqvvQv|R|QQPqRP1Q\iQ\iP)U)}\}U\UUU)T){V{TVTTT)SS$iS)T)iVT)U)i\U$Q$S$Q=^S=^\=^VUVU V UU&U&'VTST S TT'SёT"'SёU"&U&'VؑPؑTTU"S"U0oUoSUʒSQJWRJWQ U P?PPgyP3?PDNRNVP]gR P%?PUUUUUUUUUUUUUU U  U UUGUGUUU\U\]U]dUdeUelUlmUmtUtuUTTTTTTTTTTTTTT T  T TT@T@UTU\T\]T]dTdeTelTlmTmtTtuTUUUUUUUUUUUUUU U  U UUGUGUUU\U\]U]dUdeUelUlmUmtUtuUGuGUU#`U\u\]U#`]dudeU#`elulmU#`mtutuU#`P P0lUlUU0]T]STS0jQjQQpzPzRglPlVUSTUSUTVUTTUSUTVT U|S||yUS GuGP\Pu|s||~U#\s\s*}V}| U#VPPPPPPusU^U^U ^ U ^T\T\T \ T \Q]Q]Q ] Q ]RVRVR V R VXu_uX_ X _ X _ XYSS S P SuwPw_P_P_P_P _ _Q SR^oR  / R/ N N  0VvV@pN f pf q ppN f pf qM p]u u ~# u 2 U2 W VW \ U / T/ [ |k[ \ T 2 U2 W VW \ U V S [ \[ \ T#` U U  U U ! U! + U+ @ U@ J U` T S T J S P P | | P | 0 V | 53$U"# V PP U S ~k U S ~k  SP T p} 5 }5 S p}S } T  }P Q \ Q Q  \ _  _' 5 P5 V  V  P p e e P P S P  P ^  ^ 1 T1 a \a b T 1 U1 ; V; X SX ] V1 ; VB ] Vp U U U U U U U Up T S T S P P U U SU<V<=U=LVLPUPQU#T#;S;=T=KSKPTPQT-6S=KSKPTPQT-6V=LVLPUPQU`UVUU`TSTT`QQSTTVUUUVUVU UTSTST TQ QPQ QSST TVVU UT#T0CUCH\HOUOc\cdU0CTCISIOTOZSZdT?CTCHSOZSZdT?CUCH\Oc\cdUpUVUVUpTSTSTSTVUU!S!'U'ST"V"'T'V&\'\UVBmVSBmSU \  UTS TPVu |  U#u|U |  U#V)t## @#-(UU#UTT#T08U8\U08T8\T<>P>\Q`dUdeU`dTdeTpUSUpTTpQQp|R|XRpzXzYXUUTTQQUUTTQQRRUS UT TQ QRX RXY XUUTTQQ 'U'(U 'T'(T 'Q'(Q 'R'(R0TUT.V.2}}26T67U7KUM0\06U67U#T[U[cScmUnsSs|0[cSfsSPU _      6_67   7_PTPQ] ]2]7]PRH\H R t\tR\kRk\R\R\PXV X .V.7X7VPYP%UPPSF-S-7P7SSPSPH0H^U^ 0 ^ $U$4^7^0k^k00^kP^0P0HZ F0FtZ0Zk|Z|0C0oR\ 0\7\R\R\PTU _      6_67   7_S USSS_ U___PPQQSS__:M_:M_:_:_x|Tx|U|__UT\TWUWU\U\U\ T QSQWTWSTS Q VWQWQVQVMQMVQV Q VWQWQVQVMQMVQVVLQQVMQMVLSSTSL\\U\PDMP G]GKUKL]U]M]P]LVVMVT \,\U.V.1U1VUVT(S(1T1ST S TSTS(0100\iSTmSTi\m\iVmVtPmzPPSmsUVUVU%VTrSrTST%SQ]Q]Q%]rtPtS0PJWPW\PP\X\PPuvU#vU#%vrSrTS%SVUV%V0SS%S0VV%Vp&*pP0vv$P0GUGSU0]T]T0:Q:\Q0]R]VR^PA]R]VRbTbVb\bSUSUSUSUTVTVTVTPPVTSU P S 0U0iVim|kmnUnV|kU 8T8hShnTnST)m\mnU#n\U#U S U U .!S.!9!U9!Y!STV \V T \ 9!T9!F!\F!H!TH!N!\N!Y!TQ]9!Q9!P!]P!Y!QP V T /!V9!H!VH!P!PP!Y!Vu s u U# .!s.!9!U#9!Y!s ? ]? V \V T \ -!TP!Y!T? S U U -!SP!Y!S!-!VP!Y!V!-!SP!Y!S`!!U!"\""U"""\""#"U#"B"\`!v!Tv!!P!B"T`!}!Q}!!T!B"Q!!P!!V!!P!"V""P#"A"P!!P!!S!!P!!S!!P!"S" "P!!S!!S!!P!!S! "PP"\"U\"]"UP"V"TV"]"Tp##U#,$V,$/$U/$<$U<$[$V#.$\7$[$\##P$"$P##T##S#$T##S$"$S`$$U$<%V<%?%U$>%\$$P$$P$$T$$S$$T$$S$%S%5%V@%\%U\%]%U@%\%T\%]%T`%s%Us%{%U{%%U%%V%%U%%V%%v}%%P%%U%%V%%U%%V%%v}%%P&&U&+&S+&2&U2&_&S_&a&Ua&&S&&s}&&U&+&V2&`&V`&a&Pa&&V&&Pa&&S&&s}&&U&&P&&P&&P'/'U/' (V ((U((V''T' (^ ((T((^((T((^''Q'(]((Q((]((Q((]''P((P'6'0''0'6' 6' (\((\'6'06' (S((S'6' 6''X((X'6'06'Y'UY'h'1h''U((U''P''\''V((U((V((U( )U )D)VD)L)U((T((S((T(C)SC)L)T((\(K)\ ))P(( ((S((V#)B)S#)B)V>)B)PP)j)Uj)})UP)j)Tj)})Tk)p)P))U))V)*U*@*V@*G*UG*y*Vy**U**V**U))T)*]**T*D*]D*G*TG**]))0G*y*0y*}*P}**V**V))P)*\*B*\G*W*PW**\))]*D*]D*G*T**]))V*@*V@*G*U**V))P*B*\**\*@*V@*G*U**V**U**S**U**S*+U**S*+U+*+U*+0+S0+4+U4+9+S9+?+U?++S++S++U++S++U++S++U++S++U,(,U(,6,U@,M,UM,o,Uo,w,U@,M,TM,_,S_,c,Tc,n,Sn,o,To,v,Sv,w,T,,U,,\,,U,,\,,U,-\--U-2-\,,T,,S,,T,,S,,T,,S,-T-2-S,,P,,V,,V,-P--V-1-P1-2-V,,T,,\,,U,,\,,U--\@-y-Uy--S--vz--|k--U--S--vz--uz--U--SS--V--|q--U#--V--U--U#--Vb-}-P--Pb-y-uy-}-U}--s--v--|q--U#--s--v--u--U#--sb--\--U#--\--T--U#--\--]--P--]--p.C.UC..S..}k..U..S..}k..U..S.@.T@..T..T..T.G.QG.._..Q.._..Q..Q.._v.|.P..P..N.[.P[..V..V..P..V\..V..V..]..U#..]..U#..]."/U"//S//k//U/0S0$0k$0%0U%0A0S."/T"//]//} $s $-(//]%0A0]."/Q"/00%0Q%0A0."/R"//V//R//V/%0R%0/0V/0A0R."/X"//\//X/0\0%0X%0A0\."/Y"/A0Y//P/0P0%0//P//V/0V/090P90A0V//V/0V.c/0c/v/Pv//^//0/"0^%0-0P-0A0^//v/0v./_//U#/$0_$0%0U#%0A0_."/T"//]//T/ 0] 0%0T%0A0]."/U"//S//k//U/0S0$0k$0%0U%0A0SP0x0Ux00S00U00SP0|0T|00\00T00TP0|0Q|00]00Q00QP0|0R|00V00R00R00Pu0|0R|00V00R00X00U00U00T00Q00T00T00Q00T00P00u00P00U00U01U11U01T11T01Q11Q131U3141U1/1T/131Q3141T1-1Q-131R3141Q1-1Q-131R3141Q1/1T/131Q3141T1!1P!1"1u"131P131U3141U@1`1U`11S11U11S11U11U11S@1`1T`11T@1`1Q`1k1Vk11Q11V@1_1R_11\11R11\11R11R11\e1k1Vk11Q11Qu11\11\11R11Ru11Q11Qu11S11S11U11U11\11\11R11R11Q11Q11T11T11S11S11U11U11U11U11T11T11Q11Q11R11R11P11S12U202S0262U6272U723S33U33S1 2T 212V1262T6272T723V33T33V12022P23]33033]33033]33022P33PZ23Se33S33S23Se33S33S33S23V33V23S33S2 3P33P3e3\3e3S;3e3\;3e3Se33 e33Ve33S33U3=4V=4@4U@4B4VB4G4UG4_4V_4j4Uj44U33T3?4\?4@4T@4F4\F4G4TG4a4\a4j4Tj44T33Q3<4S<4@4Q@4A4SA4G4QG4Q4SQ4k4Qk44S33T4?4\?4@4T@4F4\F4G4T4=4V=4@4U@4B4VB4G4U*4/4P/4@4Q45U5L5SL5P5UP5f5Uf55S55U55U55S55U55S55U55S55U5 6U44T4e5Ve5f5Tf55V55T55T55V55T55V55T55V55T5 6T4 5Q 5]5X]5f5Qf55Q55Q55X55Q55Q56Q6 6Q4505 6045U5L5SL5P5UP5f5Uf5w5S55S55U55S55U55S55U45U5L5SL5P5UP5]5U55S55U55S55U5$5T5L5SL5P5UP5]5U55S55U85]5V55V55T85L5SL5P5UP5]5U55UQ5]5P55 55V55T55S55U6=6U=66S66U66S66U66S66U66U66S66T66V66T66V66T66V66T66T66V6=6Q=66X66Q66Q66Q66Q66066096=6T96=6U=66S66U66S66U66SU66V66V66TU66S66S66Ur6w6Pw66Q66U6;7S;7C7UC7D7UD7z7Sz77U77U77S77U77U77S77U77U66u6?7V?7C7TC7D7U#D7~7V~77T77U#77V77T77U#77V77T77U#6?7V?7C7TC7D7U#D7~7V~77T77U#77V77T77U#77V77T77U#77P7C7QD7^7Q^7h7Xh77Q77X77Q77PN7^7TN7z7Sz77U77U78U8X9SX9^9U^99S99U99S78T829\29?9T?9[9\[9^9T^99\99T99\w99Pw88P^9v9P99P88P99P 8V8V99V 88U829S^99S99U99S929\99\929S99S9-9P99P99U9:S::U:A:SA:T:UT:U:U99T9:\::T::T:9:\9:T:TT:U:T990:1:01:9:P9:U:099\99S99P`::U::S::U:;S;;U;;U;#;S#;.;U.;/;U`::T::V::T:;V;;T;;T;$;V$;/;T::]::U::S::V::T;$;V$;/;T::S::U;#;S#;.;U.;/;U::P0;K;UK;;V;;U;-<V-<3<U3<4<U4<l<Ul<{<V{<~<U~<<V<<U<<V<<U<<U<<V0;G;TG;;\;;T;/<\/<3<T3<4<T4<l<Tl<}<\}<~<T~<<\<<T<<\<<Q<<T<<\E;G;TG;;\;<\<<\<<\<<Q<<T<<\E;K;UK;;V;<V<<V<<V<<U<<U<<V<<P<<Sk;;P;;S;<P<<S<<S<<S~;;P;;S;<P<<S<<S<<S~;;V;<V<<V<<U<<U<<V;<T;<V;;\;;V;;P<< <<\<<Q<<T<<V<<U<<U4<l<Tl<}<\}<~<T<<T4<l<Ul<{<V{<~<U<<UX<l<Tl<}<\}<~<TX<l<Ul<{<V{<~<Um<t<P=F=UF==S==U=@>S@>K>UK>>S=B=TB==V==T=A>VA>K>TK>>V>>T>>T'==^=J>^K>>^==]>>P==P= >P >>]:=e=]==]:=F=UF==S==U=">SK>>Se==Ve==S==P==]=">SK>>S> ?U ?3?S3?7?U7?P?SP?c?Uc?d?Ud?i?Si??U??U??S??U??@S>>T>4?V4?7?T7?Q?VQ?d?Td?y?Vy??T??T??V??T? @V @.@T.@?@T??P??\??P??\@@P ?0?V??V??T ?0?S??S??U(?0?P??P7?d? 7?d?17?P?SP?c?Uc?d?UM?d? M?d?1M?c?TM?P?SP?c?Uc?d?U??T??S? @S@@a@Ua@@S@@U@@S@@U@@U@@S@@U@GASGAXAUXAYAU@@]@T]@@V@@T@@V@@T@@T@@V@YAT@@P@@\@A\q@@P@@V@@T@@V@YAT@@S@@U@@S@@U@GASGAXAUXAYAU@@P@GASGAXAUXAYAU`AAUAAVAA|kAAUAAV`AjATjAAT`AAQAA]AAQAA]`AARAA^AARAA^AAPAAVAAPAASAAPAASAAS}AA\AAU#AA\BBUB:B\:B=BU=BB\BBUBBUBBTB7BS7B=BT=BBSBBTB0BQ0B=BQ=BYBQYBBVBBQBBQB0BR0B=BR=BYBRYBBRBBRBBRB0BX0B=BX=BYBXYBBLBBXBBXB)BY)BBYBBYBBYRBB]sBBPBBSBBTBBQBBQBBRBBRBBXBBXBBYBBYBBUBBBB\BBUBBUBBUBBUBBTBBYBBTBCUCCUB CT CCt~CCTBCQCCYCCQ C6CU6CCSCCUCCSCCUCCSCCTCCU C2CT2CCVCCTCCVCCTCCVCCT7CaCPCCPCCPCCPQCCVQCCS}CCPCCUC DV DDUDDUD>DV>D?DU?DoDVCCTC DS DDTD=DS=D?DT?DoDSCDQDDQD6DQ6D?DQ?DDDQDDoDQCDRDDRD6DR6D?DR?DDDRDDoDRCDUD Ds DDT#D6DU?DDDUCDQDDQD6DQ6D?DQ?DDDQDDoDQCCtC Ds DDT#D=Ds=D?DT#?DoDspDzDUzDDSDDUDDUDDSDDUDDSDDUpDDTDDTDDTDDTzDDUDDsDDuDDUDDUzDDTDDTDDTDDTzDDsDDuDDU#DDsDDU#DDsDDU#DDSDDUE-EU-EESEEUEQFSQFWFUWFGSGGUGIS-G/GPiGGVGGPGGPGGVHHP'I,IPE-Eu-EEsEEU#EQFsQFWFU#WFGsGGU#GIsEE\ETF\WFG\GI\E-Eu-EEsEEU#EQFsQFWFU#WFGsGGU#GIsEEPEEPEBF]xFF] HZHPhHHPHHP,ISIPSI^IHqIIP-EE\FiG\GI\-EESFiGSGISJEWEPEBF|xFF|FBF\FBFS*F=FPFF\FFSFFPFF}33)FF]FFS/GgG|GG|EESGGSH I| IIRII|HHP^IhIPHIS^IqISIIUI|J]|JJ   JJUJJ]JJ   JXL]XLbLUbLL]LL   LbM]bMgM   gMM]IITIJTJJTJXLTXLbLTbLMTIIQIJ_JJQJJQJJ_JJQJXL_XLbLQbLL_LLQLfM_fMgMQgMM_IIRI_JV_JJRJJRJJVJJRJKVKKQK?LV?LXLRXLbLRbLvLVvLLRLLQLLVLLRL^MV^MvMRvMMVJ0JP0J_JS_JJKKPKXLbLLLLSLMMMPMM1J_JS_JJlKXLbLLLLSLLgMMMM JJ%K+KP+KXLbLMMMPMMI_J0JJ0JJSJ+KSKKVKLQLLqL LQ LLVL-LQ-L1Lq1L3LQ3LMLVMLQLvQLXLVbLeLVvLLVLLQLL0MMSQJ_JP_JzJ\KKPKXL\bLL\LLPLL\LLPgMM\MM\IIPIJJJPJMI_J0JJ0J@K0@KWKPWK LSXLbL0LLSLL0L MP M9MSvMMSMM0I~J^~JJ#JJ^JL^LdM^gMM^+KXLbLLLgMvMM+KKVKKQK?LV?LXLRbLvLVvLLRLLQLLVL^MV^MgMRvMMV+KXL_bLL_LfM_fMgMQvMM_+KXLqbLLqLgMqvMMqK LSLLSvMMSKXL]bLL]vMM]KK}KKPvMM}MONUONN]NNUNNUNP]PQUQ!Q]!Q>QU>QMQ]MQ]QU]QR]MKNTKNN_NNTNNTNP_PQTQ!Q_!Q>QT>QMQ_MQ]QT]QR_MGNQGNNNNQNPPQQQ!Q!Q>QQ>QMQMQYQQYQRRNUNPUNsNVOOPOOSPPPPP^gQQV$R*RP*RSR^NN0NJOVOPVQRVMONuON\N}\NjNTjNN}NNU#NNuNP}PQuQ!Q}!Q>Qu>QMQ}MQ]Qu]QR}:NsNSPQSgQQSsNN_>QMQ_sNN]>QMQ]NNP>QMQPNJOSOPSQRSCPZPPZPjPsCPP]SRaR]RSUSSSSS}kSSUS)TS)T0T}k0T3TU3TtTSRSTSSZSSTSSTS^TT^TjTTjTtTTRRQRtS\tSSQSSQSS\S^TQ^TjT\jTtTQRSRSS^SSRSSRS2T^2T3TR3T^T^^TjTRjTtT^STP3TDTPjTtTPS>SPhSoSPoStSVSSPSSVSSPS,TV,T3TP3T^TVjToTVRS]SSU#S0T]0T3TU#3TtT]TTUTW_WWUWW_WWUW]X_]XrXUrX|XU|XX_TTTTW^WWTWW^WWTW]X^]XkXTkXX^TTQT@VVVWVW]WV]WsWQsWWVWWQWWV?XEXV]XwXQwX|XQ|XXVTTRT WS WWRWWSWWRW]XS]XdXRdX|XR|XXSTTXTV]VVXVW]WWXWW]WWXWW]W?XX?X]X]]X{XX{X|XX|XX]TTYT W\ WWYWW\WWYW]X\]X{XY{X|XY|XX\:WZWPXXPU-UPUUPU;VR;VVVWPsWWRWWVW?XJX]XXXXPXXUX`_``U`a_aaUab_bb  bvf_vfzfUzf:i_XXTX:iXXQX:iYYPYHYVYYPZZP__P__V``^5d:dPeePee\efPf*fVh&h\XXuXYYCYPCY_w_```U#`bwbbb:iwXXuXYY1S1o01՘1rsPsXs^t;tP{{P{"}^^ȉ^^^,P,>~ŐPPJSGSSppuppppU#p.q.q1qr1qq}qqU#q}~o}}Ȅ8]ȉމ]Ȅ8}ȉމ}Ȅ8~ȉމ~Ȅ8}ȉމ}PSȉΉPΉىS$~$]$Pzy{]]IS]zy{}}IS}zy{~~IS~{0{PPISPD{r{~D{r{]e{r{Psqq .I sqq1.I1sqq].I]qq .I qq1.I1qqT.ATqq].I]>yy0"}-~0H~K0F0 >0l0ɏ00"0>0Sx06o000F0ƙ0>yy}"}-~}H~K}F} >}l}ɏ}}"}>}Sx}6o}}}F}ƙ}>yy ~~""}-~ ~~"H~K ~~"F ~~" > ~~"l ~~"ɏ ~~" ~~"" ~~"> ~~"Sx ~~"6o ~~" ~~" ~~"F ~~"ƙ ~~">yYy_Yy]yTSyyS"}0}S}}S}-~SH~~S~vSSKSF\Sϊ(SɏُSSǐSpS"S6oS՘SJ}}~J}}]i}v}P}}8}}}}-~}}՘}ɏ}ɏ1 ~-~ ՘  ~-~1՘1 ~-~]՘]'~-~ ՘ '~-~1՘1'~-~T̘T'~-~]՘]~~5~~}~I}>}} I  I1 I]'I 'I1'@T'I]t4t}] ]]]$]>]Sx]]՘]5P5m\$PSe\\՘ޘPޘߘ\} }}}$}>}Sx}}՘}V VϊVVV$V>VSxVV՘VRR1^ m1ϊ1^$1Se11՘1^^]]RR^^TT]],mVSeVV,m]Se]]՘V՘]"K "K1"K])K )K1)BT)K]FPl}=P=w}$APA}ŔPŔ}>}}F}l}}$}F}ƙ}ϊ}}>}>}>1ϊ Xϊ1ϊ]ϊ Xϊ1NJTϊ]!&~!>}n2n}0}~]ݐPuP6}Fo Fo;Fo]Mo Mo;MfTMo]" λ"6"]" λ"6T"]V}F F1F]%F %F1%>T%F]qr}Ȅr}ȉމ}Fe}qr ~~"Ȅr ~~"ȉމ ~~"Fe ~~"qq_8P_PTT4rr}E}4rr ~~"E ~~"4rQr_ _ $Trr}r}r}rr ~~"r ~~"r ~~"rr_rXs}{"}}}ȉ}}}rXs ~~"{"} ~~" ~~"ȉ ~~" ~~" ~~"rs_%sXs]7s;sP;sXs\%sXs}Xst}{{}x}Xst ~~"{{ ~~"x ~~"Xss_ssTs@tS{{SMtt}{{}x}WtbtqbttP{{P{{}xPstt Tx Tstt1x1stt_x]ztt Tx Tztt1x1zttTxTztt_x]tju}†}}tju ~~"† ~~" ~~"tt_ttTtjuS†цSSuu}E†}uu ~~"E† ~~"uu__Tuhv}6}}Ōr};l}}Zb}ؕ}ܗ}uhv ~~"6 ~~" ~~"Ōr ~~";l ~~" ~~"Zb ~~"ؕ ~~"ܗ ~~"uv_vvTvhvV6VVŌrV;lVVZbVؕVܗVJvhv6Jvhv}hvv]vw}vw ~~"vv_wwPw=x~~Ƈ~F~6~މ~>~~~ɏ~V~JZ~~>ؕ~L.~ܗ~*~~~e~ƙ~Dw=x}y{{}}Ƈ}F}6}މ}>}}}ɏ}V}͒Ԓ}JZ}} ~ 0>ؕ}L.}ܗ}*}}}e}ƙ}Dw=x ~~"y{{ ~~" ~~"Ƈ ~~"F ~~"6 ~~"މ ~~"> ~~" ~~" ~~"ɏ ~~"V ~~"͒Ԓ ~~"JZ ~~" ~~">ؕ ~~"L. ~~"ܗ ~~"* ~~" ~~" ~~"e ~~"ƙ ~~"Dww_y{{_G_n__F_6_މ___V_͒Ԓ_JZ__]>ؕ_*_hwlwQlw=x~y{{~~Ƈ~F~6~މ~>~~~ɏ~V~͒Ԓ~JZ~~>ؕ~L.~ܗ~*~~~e~ƙ~hwlwPlw~wSy{{Shw=x}y{{}}Ƈ}F}6}މ}>}}}ɏ}V}͒Ԓ}JZ}} ~ 0>ؕ}L.}ܗ}*}}}e}ƙ}mw~wPy{{P{{P͒ԒP0~Ƈ~F~60މ0~0V~JZ~~>ؕ~*~ p $@N$) ~4)Ƈ ~4)F ~4)6 ~4)މ ~4) ~4) ~4)V ~4)JZ ~4) ~4)>ؕ ~4)* ~4)~Ƈ~F~6~މ~~~V~JZ~~>ؕ~*~\n\\\F\\V\JZ\>ȕ\*\_^Ƈ^F^6_މ_^_V^JZ^^>ؕ^*^aƇaFa6aމaaaVaJZaa>ؕa*a}Ƈ}F}6}މ}}}V}JZ}} ~ 0>ؕ}*}U]Ƈ]F]6]މ]]]V]JZ]] ~  >ؕ]*]/5P5VƇVFVVVVJZVV>ؕV*Vi0n0PdhPhqSP\PPSȕ̕Pؕ̕\‚P‚~6~މ~~ʂ~Ƈ~F~6~P~~V~JZ~~>ؕ~*~0~Ƈ~F~60މ0~0V~JZ~~>ؕ~*~ʂ~6~~׃~'~F~׃}'}F}׃]']F]0׃P'PA0AFPPS~V~*~}V}*}]V]*] NPP*P>99>}}ɏ]L.]ܗ]]]e]ƙ]0PLq0qyPP\0P.0ܗ0\0PPe0ɏ}L.}ܗ}}}e}ƙ}PɏSL.SܗSSSeSƙSH}^ɏ}}ƙ}H]^ɏ]]ƙ]&3P^ɏSSƙS^ɏ}}ƙ}^ɏ]]ƙ]PVɏSSɏ]][pPT T=xx}Km}}̀-}~}Ō}/}"V}J}b}L}}=xx ~~"Km ~~" ~~"̀- ~~"~ ~~"Ō ~~"/ ~~""V ~~"J ~~"b ~~"L ~~" ~~"=xix_ixmxTcxxSKWSS̀ӀSS-S~S2SQSSSbSSJqq}y;z}.I}Jqq ~~"y;z ~~".I ~~"yy_yyTyySLzz}zy{} }}IS}}}Lzz ~~"zy{ ~~" ~~" ~~"IS ~~" ~~" ~~"Lz\z_hzzRhzzrhzz]zz] ]]]zzP Phzz}zz} }}}|"}SSSF|"}VVȉVVVF|f|SÉSF|"}}}ȉ}}}W|c|PȉPc|r|PP]`p `tPKm]Km}Km~ ] } ~]}~E]E}E~̀׀}8׀S"VS]}~~]~}~~}b}ȁρqρPbP 1] 1T]-Q]-Q}-Q~܆~܆]P6]]]Zb]6}}}Zb}6~~~Zb~c0Q0YYXYXZbYXŌr};l}ؕ}ܗ}˗ܗP"0"AQؕڕ0/]/}/~ X1]Ǒ XǑ1ǑTǑ]J}L}} r :Q:QQ!J !J1!J](J (J1(AT(J]4}6GS6L}0} $U$%U $T$%T $Q$%Q0AUAlVlmUmVU#V#&U&5U5TVAlWlmTmW\~!W!%\%&~&5T5TWAlVlmUmVU#V#&U&5U5TVqPSÚPÚS"S9EPETSP`sUsU`sTsTx|P|SUʛSʛUUTTTQ՛V՛ܛQܛVQQʛΛPΛ՛SśP`tUtuU`tTtuTptTtuTptUtuUÜUÜSU'SÜTÜ'TÜQÜV'QPSÜTÜTÜUÜSU0UUUVUVU˝U0UTUSTST˝T0UQU\Q˝QPZSTZVUНםUם۝uo۝ܝUUuxU%U%*S*,U,SUS%T%,T,<T<TTT%Q%,Q,<Q<QQQ%R%,R,<R<LRR8<T<T8SUUÞUÞ՞U՞UUUTÞTÞўTўVTTTQÞQÞ՞Q՞QQQϞ՞Q՞QϞ՞U՞Up55U5|6\|66sk66U66\66sk67U77\77sk7 7U 767\6787skp55T57T7$7T$787Tp55Q577$7Q$787p55R57R7$7R$787Rp55X55_57X7$7X$7*7_*787Xp55Y56]66Y66]67Y77]7$7Y$787]55P56S66U#66S67U#787S5667*78756V66V67*787V56]66]67Y77]*787]55P5667*78756^66^6777^*787^566666V77*7875667*7875|6\|66sk66\66sk67U77\77sk*767\6787sk|66P66P66\67P77\D6k6T66T77T55056P66_66_77_*787P5K60K66_66066_770*7870K66366056S66S67U#77S*787S@7~7U~77U77U@7]7T]7~7P~77T77P77T77P77T@7z7Qz7~7X~77Q77Q@7x7Rx7~7Y~77R77R@7v7Xv7~7w~77X77XY7v7Xv7~7w~77X77XY7f7077077U748\48;8U;8g8\g8w8U77T7,8S;8g8Sg8w8T77Q7,8],8;8Q;8g8]g8w8Q77R7,8^,8;8R;8g8^g8w8R77X7,8V,8;8X;8g8Vg8w8X77Y7,8_,8;8Y;8g8_g8w8Y7,8V^8g8V7,8S^8g8S7707+8T^8g80K8^8\K8^8SK8^8 88U88U88U88T88Q88T88T88Q88X88Q88Q88R88Y88R88R88U8<9\<9?9U?9Z9\Z9t9Ut99\88T849]?9Z9]Z9t9Tt99]89Q9:9V:9?9Q?9Z9VZ9t9Qt99V89R999S?9Z9SZ9t9Rt99S89X99@9?9X?9Z9@Z9t9Xt99@99X89Y99H9?9Y?9Z9HZ9t9Yt99H99YK9Z9\t99\K9Z9St99SK9Z9Vt99V99U99U99T99t199T199Q99Q99U91:V1:7:}k7:j:Uj::U::V99T9j:Tj::T::T99Q9?:\?:D:QD:e:\e:j:Qj::Q::\99R9j:Rj::R::R1:3:P3:7:VD:c:Vc:j:P::P:7:SD:b:S::P::S:7:SD:b:S99u97:]7:D:U#D:g:]g:j:U#j::u::]::U::U::U::T::T::Q::T::Q::Q::R::R::R::U::U::T::T::Q::T::Q::R::Q::R::X::R::X::Y::X::Y:&;U&;';U';6;U@;F;UF;G;U@;B;TB;G;T@;F;QF;G;Q@;F;RF;G;RP;;U;<S<0<}k0<_<U_<x<Sx<}<}k}<<U<<SP;z;Tz;<TP;;Q;.<\.<5<Q5<X<\X<_<Q_<{<\{<<Q<<\P;;R;j<j<<R<<P;;X;&<^&<5<X5<\<^\<_<X_<<^<<X<<^P;;Y;;_;_<Y_<<_<<Y<<_;;P;&<V5<V<V_<y<V<<P<<V;&<V5<V<V_<y<V;&<45<_<4;&<_5<B<PB<^<_;<P<"<P"<&<S5<U<SU<n<Pn<<];0<]0<5<U#5<Z<]Z<_<U#_<}<]}<<U#<<]<<U<Y=SY=]=U]==S==U<<T<]=T]=n=Tn==T<<Q<Z=VZ=]=Q]=g=Qg==V==Q<<R<=\==r=]=\]=s=Rs=~=r~==\=8=P8=C=Q==P<<0<=P=T=\]==0=>U>=>S=>A>UA>t>St>x>Ux>>S>>U>>S>?U=>T>A>TA>J>TJ>>T>?T==Q=>>V>>A>QA>R>QR>u>Vu>x>Qx>>V>>Q>>V>?Q==R=A>RA>R>RR>m>Lm>x>Rx>>L>>R>>L>?RY>m>Px>>P>>\>>\>7>P>>P>>P>>P?f?Uf?;@\;@A@kA@B@UB@P@UP@@\@@U@@\?B?TB?@T@@T@@T?t?Qt?3@^3@B@QB@Y@QY@@^@@Q@@^?t?Rt???B@RB@Y@RY@@R@@R@@R?t?Xt?@S@B@XB@@S@@X@@S?t?Yt???B@YB@Y@YY@n@n@@Y@@Y@@Y?A@_A@B@U#B@@_}??P?3@Z@n@Pn@@@@@@P??P????P??]??pn@@P@@]@@P??P???3@]n@@P@@]@@]??P?3@V@@P@@V@3@V@@P@3@v@@P@3@S@@ {@AUAB]B B    B&BU&B[B]@$AT$A BT B&BT&B[BT@-AQ-AAA BQ B&BQ&B5BQ5B[B@@R@AVA BR BBRBBVB&BR&B[BV@@P@ B BBPBBB$BP$B[BCAsAUtA{AP{AAUAApTBbTbkTQkQ3Q3Y x $ &YkQpRARAMRMg[gRRpXXpYAZAwY~ZYZYp  -P-AAqPq~~PPPPRA[AMRMg[gwR~[RV V.U.KVKNUNVU6T6NTNVT&EWTP&TNVP01RQR&0NV1`USUSUSUCSCDUDrSrsUsSUSUDSDEUE|S|}U}SU S  U :S:;U;|S|}U}SUSUdSdeUeSUSUSUZSZ[U[{S{|U|SUSUSU"S"#U#CSCDUDdSdeUeSUSUSUSU S U * S* + U+ K SK L UL l Sl m Um v Uv S U S U S U  S  U @ S@ A UA h Sh i Ui S U S U 3 S3 4 U4 X SX Y UY S U S U S U  S  U 9 S9 : U: Z SZ [ U[ { S{ | U| S U`TTTTTTTDTDUTUsTsTTTT'T'ETE_T_}T}TTT T T;T;_T_}T}TTGTGeTeTTTTTTT[T[^T^|T|TTTTTTT#T#&T&DTDGTGeTehThTTTTTTTT T T + T+ . T. L TL O TO m Tm T T T T T T T  T # T# A TA K TK i Ti { T{ T T T T 4 T4 ; T; Y TY c Tc T T T T T T  T  T : T: = T= [ T[ ^ T^ | T|  T TJSU HSU DBCSCDUD t#DB#CSCDU#D RsARrSrsURs O@SU >?SU ?SU $E>$DSDEU$E \}=\|S|}U\} 8SU  ; S  U  V;::S:;U; ?\}4\|S|}U\} 2SU nDe5DdSdeUDe %7SU 9SU 56SU [6ZSZ[U[ :[6:ZSZ[U:[ [|6[{S{|U[| |6|SU| 6SU 6SU <SU #<"S"#U# |#D<#CSCDU#D oDe<DdSdeUDe be<eSUe <SU 3SU 3SU  3 S U  + 3 * S* + U + + L 3+ K SK L U+ L L m 3L l Sl m UL m v Bv S Uv a ; S U J = S U   2  S  U   A @ @ S@ A U A -A i >A h Sh i UA i x 7x S Ux  9 S U  9 S U ! 4 ? 3 S3 4 U 4   4 ? 3 S3 4 U 4 4 Y ?4 X SX Y U4 Y Y 5Y S UY  5 S U  5 S U  4 S U   4  S  U   : 9 9 S9 : U : +: [ 7: Z SZ [ U: [ [ | 7[ { S{ | U[ | | S U U c \c j Uj \ U \ T e ]e j Tj ] T ] Q a Va j Qj V Q VD Z P P P [ Wj W  W P S ` Sj S S 0  P 5 Pj } P P S  R  S R 0 1 Y X  Y  0 1 U'S'-|@-.U.9S T 9T Q 9Q R R qp"P&V.7V 0 1 X@lUlvU@JTJVTVeTevTVlUlvUVeTevTUUUUTTTt=TTTUU\U\U\kUTW]W[U[\T\kT 0ST?s?FS&*P*FVU^U^TVTVP\\PSSur^^XSSXVVq 3$v"+s 3$v"+Eps 3$v"XSUUUUU U 'S')U)TSTYUYZUT(V()T)UVUZTQZQ?P@YPDUVUZTDTSTYUYZU`U7S7AUAHS`T>~>ATAHT`XAXAHX#P2_<]<A 0X $0)(2#AH]^P^AHPP 0x $0)(0#P 0x $0)(0#A 0X $0)(0#AH 0x $0)(0#01ZYZ0AH12~2X2SPUSUSPTPTP]Q]YQPRwRPXPXPZYZVYVPPU1S16U+T+6T@UX]X]U]]U]@TNN]T]TT@[Q[NSN]Q]xSxQSQ@cRc|Px|R|RwR]]wwxqxpt#G^]c^PG_]c_utG]]c]_]c_S]cSq 3$s" 3$s"p]c 3$s"G_ww]U]wwPP]U]0 ^1_1P:PhRhxSxQhop 3$s"ox 3$s"x 3$Q"&U&SUST\T\=W=\USU U VU<VT\T<\Q<QQ<Q U VU<VQ<Q U VU<V%S%s2s2<SQQ2QQ\2\QV2VQWUWvvU2v@LULMU@HTHLQLMTPbUbnSnpUpwSPTUwT_TUwT_bUbnSnpUpwSvTUwTvnSnpUpwSvVivpwVUUUSUUSUU*U*2U T 2T T*u0@UUU@{T{uTTTU T T!U!+TQQQ Q &Q&+QQsp Qq(Qq(P0sQP0sQs#x0pQp#x0 T!U!+T &Q&+Q0IUISUS0;T;VTVPP@V8U8^U4!^4!\!U\!o!^o!r!Ur!!^!!U8T84!~4!@!T@!!~!!T8Q8pSp4!Q4!`!Q`!o!So!r!Qr!!S!!Q!!Q8R84!~4!`!R`!o!~o!r!Rr!!~!!R8p0p~~4!~!!~80P4!a!0a!o!Po!r!0|!!P!!0p\\|X\P_ \ _ P 4!\!!\p~~4!~!!~p^^4!^!!^P]JgPosPsSP P'!4!PNV]PV] ! N] ! ~~rw ~ 4!~!!~P__P_\~w P _ _ \ 4!_!!P!!_}P~ ~~4!~!!~p0V0VU]Vw 0!!0!!ŝ^^rw ^ 4!^!!^VVJVrV~ ~ !V~~rw ~ 4!~!!~__r_\~ _ \ 4!_\\|Xr\P_w \ \ _ P 4!\!!\00rw 0 4!0!!0V~J~r~ !~rw  4!!!F]J]r] !]0:SS/]/JSrS !S$?]*2Q*2T*2p] R ~~ pr~Rr_\~ \ _] ]sHs~sHU_@|@~ ] # }# Y t ]!!}w ~ ~!!~j w PC w ~ w 7 7!!7  T C ] T!!] w  !!  0 # 1# + Q+ 3 P3 C Q 0!!1w ŝ V Q V!!ŝw 0 p~ ~ p"!!0@!`!To!r!T!!U!!V!!U!!V!+"U!!T!+"T!!Q!!Q!"Q""P""\""+"\!!R!!\!!R!"\"+"R!!X!!]!!X!!"]!"""X""+"]!!P!!P!!P!"V""+"V!!u 0"4"U4"5"U0"4"T4"5"T0"4"Q4"5"Q0"4"R4"5"R0"4"X4"5"X@"Z"UZ"e"Ve"p"Up""V""U@"^"T^""T@"^"Q^""Q@"W"RW"e"\e"p"Rp""\""R@"^"X^"o"]o"p"Xp""]""X""]_"e"Pp""P""P""V""V@"B"u ""P""\""\""U""U""T""T""Q""Q""R""R""X""X""T"#T""Q"#Q""<""P"#P""0#(#U(#_#]_#`#U`#}#]}#~#U~##U##]#(#T(#]#\]#`#T`#{#\{#~#T~##T##\#(#Q(#Z#S`#x#S~##Q##S##P##SK#U#P`#n#Pn#~#L;#J#PJ#[#V`#y#V##P##V##U##U##T##T##U##S##T##U##V##U##U##S##T##U#+$U+$5'_5'9'U9'd'_d'e'Ue''_''~')_))~)[+_[+d+Ud++_#:$T:$+#:$Q:$V'^V'e'Qe''^''Q')^))Q)+^#:$R:$$V$V']e'']')])+]#:$X:$+X#:$Y:$+~#$0 %:%PZ%j%P%&P4&D&P&'P<'S'P''P''PL(k(P((PU*a*P**P**Pg+l+P#:$R:$\'V\'e'Re''V''R')V))R)+V#'S'\'vX"\'e'RX"e''S''vX"''RX"'z)Sz))vX"))RX").+S.+8+vX"8+[+S[+l+vX"l++S$$0$$P$|%0|%%1%e'0e''P')0)l+0u++0$$P$+$u +$:$ :$+~.$5'_5'9'U9'V'_e''_''~')_))~)[+_[+d+Ud++_$$_$$]%%_%%]+(K(XC(K(UK((_u++_++T++_p))_.+8+_p)).+8+p)z)Sz))vX".+8+vX"p))]))S.+8+P)U*_)U*)U*S)D*] **R*U*++U+&,U++T+$,S$,&,T++Q+%,V%,&,Q++R+&,R++X+&,X++Y+&,Y0,4,U4,5,U0,4,T4,5,T0,4,Q4,5,Q0,4,R4,5,R0,4,X4,5,X0,4,Y4,5,Y@,D,UD,E,U@,D,TD,E,T@,D,QD,E,Q@,D,RD,E,R@,D,XD,E,X@,D,YD,E,YP,[,U[,,S,,U,,U,,\,,U,,\,,U,-U--\,,T,,S,,S,-S- -P --S,,P,,P,,\,,P,,V,,V --P--V -&-U&-'-U0-A-UA-J-SJ-R-TR-S-U=-N-VN-R-U`-o-Uo-p-U`-o-To-p-T`-k-Qk-o-qxo-p-Q`-g-Rg-o-Xo-p-Rp-t-Ut-u-Up-t-Tt-u-Tp-t-Qt-u-Q--U--U--T--T--U--U--T--T--Q--Q--R--R--X--X--Y--Y--U--U--U--T--t--T--T--T1--T.*.U*.+.U+.3.U..T.*.t*.3.T.*.T*.+.T1+.3.TU3U36UT3T36T0uU%U u"3600.P.2py360@`U`H\HOUOn\nUU\@zTzFVOlVV@zQzQzTTJJ]JOTQ"Op]pTQ"]Jz0z_<_Oz_RJz0zSs Ss<SOkSdUuUU P8<Pz %Q}QsVstQr"t}VwhZ=Z[=[U"S"#U04U45UTuU"S"#U04U45UUUTTQQUUTTQQ $U$%U $T$%T04U45U04T45TP]U]_UPZTZ^Q^_T`mUmoU`jTjnQnoTpvUvzPz{UpyTyzUz{TpzQz{QUUTRTQTQUUTRTQTQ 0 HP up"pu"11R1Hup" tp"pt"11ARAHtp"`UqU`zTzT`0RPRPe0U q"qUU q"qU+8USrUU%+UTTUR]RSUSbUb]TSTSbTbTS\bSB\`\0BVbVS sX BSbSU>_>?U?l_lmUTmTQmQ^^]%^]%:]?M^]Mf^]fh^hllm UU#POjPpU\Ur\rU@\@lUll\lU\ U \ 5 U5 T \T UpTVTVT)V)0T0 VpQ]Qr]rQE]ElQlg]gQ] Q ] 5 Q5 T ]T QpRSRrSrR(S(0R0 SpX^X^X/^/0X0 ^OWPPPPP0 pR# R# p" pR#rs#pSR#`^^q ^ w ^ ^ d ^T ^ ^`SSq S w S S d ST ^ S`VVq V w V V d VT ^ V w  T TU U0puu p" 09lRR R0RR 5 R R c Rw R R9l^^^0q ^w ^  ^d ^ 5 ^^ ^9lSSS0q Sw S  Sd S 5 S^ S9lVVV0q Vw V  Vd V 5 V^ V8f f8 8  8 2 2 4d 4 4 @ @ 1Ts#PTUPSPTUT[S T S\STTT[\QQVQTQT[V)P)1s1BpXBOq(TYP`~U~\U`uTu]T`qQqVQ`~R~RPSPUTUUTUU"UUTU04u49uQT"T04U45U04T45T04Q45Q 3T38u8]T]TuT+818<RtR<QRP".P/@Pp.QNRUSUSUUUTT 1 c[j[1[<[1&0&<R<Ir1$IcRjR0Rr1$R0&0&cQjQ0Q)Q0c0j0QSjSkvSwS0UUUEUEUUUTST S TSTSSESESUEUEUPSPEPXE^0^XEXESUEUEPSSTUUPPsT#ISES7SIUEU7U"IPEPP7PIS'SIU'U|QUSURSRSUSSTTTT*T*STSaTathtT=SPbtPARSRSUAS1USUPPS8U8SU S  U ; S; @ U@ A UA ] S8T8TTTTX] T8Q8VQQVQ V  Q < V< @ T@ A QA ] VPP[S S  U ; S; @ U@ A UV ] SS2A V SA V 3` d Ud S Up P P~ S U  S  U 2 S2 ; U; S U  S T  \  T N TN \ T  \ Q  V  Q Z QZ V Q  V P P P  P_ c P_ V Q  V_ S U  S P : U: S U S U S U  S : T: V T T V T V T  T  V; B PJ N PV ] P P D UD S U S U S  U 3 S3 4 U D TD T T T T T T  T 4 TE I PQ U P  P@ H QH W QW w Q U f T 2w2==[w[f ] T s 8] P S P 3S \ P \'|v"'*V 'V _pUUUUUU U UpTSTSmTmTTTZzz~Z;Z;NzNQQQSzmZzQzZZZPpP6P6=pmPp~PVSVmVV0T@T@GPmTTTT1XxXSXmXXXQ y2$s"DQDS y2$s"mQ y2$s"Q y2$s"Q y2$s"Q y2$s" $'C0BEH lt}'0:"$0257`hkx 1"%jqjq %@\>DHu7;>Y7;>N"8x,1Xf 1 5 8 < X ` υ܅DUZ\ (&.159P`af5MNS͎.|1K|Տ1K$0=Zё"'`G W@W GKuVY] -6DJLQ qsy Hm  p}Lip0% " ) ? !-!P!Y!#####($<$[$$$$$$ % %%%%%%((((D)I)P)^)b)p)t){)*-******+///%/00000000111111(141u111111u1~11111112333h3x3z3}34 44;4)50585]5555598999E;x;~;;;%<&<,</<8<<<<<<<q;x;~;;;<<<<<8<w<<<==== ?2???@?O?S?h?@?G?M?O?S?h?AFAJAYABBBBCCDDD"DzDDDDDDEHFFGFFFGH`HH I0IqIHH^IqI+KWK\KgKL&MKKKKvMMsNN@QMQNNN@OOPQRNNNNCPkPmPpPWRaRT UU-UVVW@XPX]XXXW@XXXYY%Y,Y0YPYYZZ[0[|^^_`bbbb$c@ceckce0fh&h:iYY%Y,Y0YPYZ[0[x[\|^^_`P``aab@ceckc%d:de0f g;gh&hhi:iYY0Y5Yu[x[`a bb:deddedeeKfkfg gdhh3bbdeg gdhhbbee:d=dBdSdKfkfhhdddeeddielenee5YPYX\8]uddff;gZg&hEh5YPY\\e\m\p\\uddff&hEh0[3[8[M[@ceckccbceckcc8]@^a bccdd0fKfkfffgZgygggF]];fKffffgn]]ffa bccddkffZgygggaavffaaccggb bcckfvfZgyg@^|^^_`P`c%dedudddedeghEhdhi:i^^edudgh^^edud[\ gghi gghiP``aab$c%d:dg;g#aLag;giYY$c@cYYe0fZZ[0[_`eeh&h%ZkZ[ [[0[ppppЄ$ȉމppppz{ISppppz0{2{9{r{{ISsqq.Isq{qqq.Iqq>yy"}0~H~KF >lЏ">Sx*oFƙ>yVyYy^yeyly}}}}}}} ~Џ׏ُЏ׏ُЏ׏ُ ~0~՘ ~ ~'~0~՘~~~~~~~   'Pbit _Њ$Se՘")K|,Њ&>\cs&*ogp6FMo"y%Fqqqqqq(r-r4r>rArDrrrrrrrrs`ssssssMtht{{httxhtstzttxttttttuuuuuuuuu vvvv!vpv}vvvvvvv8w=wDw@x{{F6މ>/;ЏV͒ԒPZ>ؕL.ܗ*eƙ8w=wPwZw]wewDwPwhw~w{{F6މ/;VPZ>ؕ*pF6މVPZ>ؕ*ʂ6؍FPZV*>VJ^ЏL.ܗeƙHJ^Џƙy@xfxixnx|xxyyyyyz@zEzLzVzhztzwzzzz {"}ȉԒܒF|r|ȉKmQŌmoH̀"VՁjqՁȆц܆6ZbŌr;lؕܗǑ!(P$+6LH0THԚ0@Ĝǜʜ8=@C55566666770787S7f77778 8888`8p8K9T9x99p5G@W`W&HxHHHGHP'  &NV    V]^v?#&4rXDLPSUZAHlt|1]c]cFIQ:!9BQ2<!92<!9BQ2!9BQ2Q[fpwV[pwY$4!!!YpbJ !4!$NJr !!$@0r r %)- !! = !! !!$$.$6$G$O$e$$$$$%%%%((((u++y++++p))))).*1*;*+0Xchp Hh|`!%'x  d T Y  = A G  9p0x  d 5 ^ f 8 < B LHPH dP 0UX[g  p4@66N S S W $ @:JH"P"X"`"""""("  `/ . W E ^ @2t  p   P $   5 "N_ p5y @7f @W  p 7 P 0 /:X"G `WI W\ Wr("P" XH" PXw X p( `\ ](  A Zj p P 0 c_ dG d  / H a ` z 0  !   `# -) B Ы[i 0|w |n  `/ n 7 @= 4 P@ `\M b {  B У P pA W I6 p^ 4| Х=   m p $ . _M @tW ~    %  #  @  7S  7u   $   e  w  :  -S  2l  @  ,  @%  `  2  @9%  `?  0X  q        @Z  P  P  "1  J  (c  $|    %  @$  #        д5  @N  $g  `$       @#         3; PPBO Qk+ PRTb S] @T= j ^7v &  _Y `6  ``a`"  `{ Pa#: pS ap bS @/ bZ @c 0dy e g P! m;PjT@"|  0 @ P+"( V @a P.#3 .L]o~ . @~ C  9  9 pD2 ПDI 9b 9{ 9 n9 _9 P9 @5 @9/X"!  9 PoQ r bP Pb$ i Ј i ` j8> eT"r y 0. В) g9 ~  # 06 rZ ` @i) p[ 0Z pd PeD pkW f: ,U  f `#  I ' ^* mE p$s ]" bW @( 0~a  g$ йI ha `h+{ K hI 3 a `tf Ё $ PB b(T 0 ЁK G  `c-  H" P#@ W `r M 0 v?  i PZ7 / R pY b Aw o m P7 0c, q f&" $1 GD 0wU Y}e u Ph u P[  pvt `[ eQ 2 kP PQk @b~ ` Q k/  0f$ p^Z( h@ @@R {(c Y} s g h o&  p]  C Ж] 6  df g P    E  d  0I  m,    }    02! @6%! 0j'=! PuN! Z!"g! Ќ6! 0! p! p!  " -," pfJ" -f" py" F" `" :" mt" `a# `xy# m D# _# ux# G# yc# # # # P{$ t!$ @_F$ `_$ P}!u$ w$ $ `T$ ~d$ HV$ 0h% :% `fV% pi"y% `7% @% @% @}% l% & Y/& hlH& pnh& Е& r& @q& & G' G%' c '' j ?' \' 0ap' #' pg-' Pz' k ' 0#' G!("*( x?( `k W( 0#z( p_( f.( h"( Pd6( G) P)) p:D) l\h) pKy) i,) f) o) 2) * @x$* 0M* Cd* v* D* ^* O* z* g* ЕL+ Pk+ \]-+ qG+ i"a+:t+ C+ +("+"+ + `+ p, ,  <,  \, |,n, `g, g, p{, `, =, 5- 02- oI- lq- ^L- Z- "-  - - - ~. 0b. pE6. `G. 0i. p[{. ЋW. S. . 8>/ (/ І_/  / // 9/ p#/  $0 < A0 n0 20 0  0 @R0 00 t 1 G1 pt1 1 @D>1 p 1 t11 M<2 82O2 0D~2 :(2 NC2 .2 23 033 )M3("T3 s3 @Mb3 3 }V3 `244 `.74 b4 #4 4 5g4 P5 F#5  Z5  5 $55  5 5 x6 04 36 0e6 &6 t36 `6 P6 #!7 Y7 p77 7  8 @O 8 `6F8 t^8 $8 88 38  9 CL"9 `B=A9 n9 89 29 t{9 @9  9  : F : p~8: o:  : 0:: @: P;1; @4 c; ;  ; pQj; ;; < @K< e< x<  < Ѓ<<  = `9= \U= ul= P= = NC= =6= 0~@= P;j> P>c> s{z> > >> # ? 6? 1%Y? CLp? M6? 3? ?@ 0$@ ,@ Є L@ Ђ\@ 2@ @;@ d@0"@ @Fq@ 1f@ A PI)A  NA A QjA AA("A @B .B 0NFCB rB D>B ~B pB ?B Ч6B #C C C5C `4cC C u&C :C $C P4D 1D PgJD nD ~D EZD 0D #D D 2E 1E jE ~E 0E E `E 0F `F JF  `F  F F F EZF lV G ЅFG ZG 09vG @G $G kBG"[ SH GH  H 2H 9H :FHH nghttp2_stream.cstream_lessstream_obq_pushinsert_link_dep.part.2__PRETTY_FUNCTION__.5983stream_subtree_activestream_obq_remove__PRETTY_FUNCTION__.5858__PRETTY_FUNCTION__.5871__PRETTY_FUNCTION__.5908__PRETTY_FUNCTION__.5916__PRETTY_FUNCTION__.5921__PRETTY_FUNCTION__.5997__PRETTY_FUNCTION__.6012__PRETTY_FUNCTION__.6034nghttp2_submit.csubmit_headers_shared_nvasubmit_response_shareddetect_self_dependency.isra.0.part.1__PRETTY_FUNCTION__.5334submit_request_shared__PRETTY_FUNCTION__.5494__PRETTY_FUNCTION__.5591__PRETTY_FUNCTION__.5599crtstuff.c__JCR_LIST__deregister_tm_clones__do_global_dtors_auxcompleted.6355__do_global_dtors_aux_fini_array_entryframe_dummy__frame_dummy_init_array_entrynghttp2_pq.cbubble_upbubble_down__PRETTY_FUNCTION__.4625nghttp2_map.cmap_resize__PRETTY_FUNCTION__.4665__PRETTY_FUNCTION__.4675nghttp2_queue.c__PRETTY_FUNCTION__.4027__PRETTY_FUNCTION__.4031__PRETTY_FUNCTION__.4035nghttp2_frame.cbytes_comparnv_comparframe_pack_headers_shared.isra.3__PRETTY_FUNCTION__.5938__PRETTY_FUNCTION__.5959__PRETTY_FUNCTION__.5969__PRETTY_FUNCTION__.5979__PRETTY_FUNCTION__.6018__PRETTY_FUNCTION__.6028__PRETTY_FUNCTION__.6039__PRETTY_FUNCTION__.6059__PRETTY_FUNCTION__.6071__PRETTY_FUNCTION__.6099__PRETTY_FUNCTION__.6127__PRETTY_FUNCTION__.6134__PRETTY_FUNCTION__.6146__PRETTY_FUNCTION__.6220nghttp2_buf.cbuf_chain_newbufs_alloc_chainnghttp2_outbound_item.c__PRETTY_FUNCTION__.4735nghttp2_session.csession_call_select_paddinginflight_settings_delactive_outbound_item_resetsession_inbound_frame_resetsession_newfree_streamssession_ob_data_push__PRETTY_FUNCTION__.6736session_call_error_callbackob_q_free.isra.9session_ob_data_remove__PRETTY_FUNCTION__.6742session_detach_stream_itemsession_update_stream_prioritysession_resume_deferred_stream_itemnghttp2_session_is_my_stream_id.part.19session_is_new_peer_stream_idsession_detect_idle_streamfind_stream_on_goaway_func__PRETTY_FUNCTION__.7076session_headers_add_pad__PRETTY_FUNCTION__.6845__PRETTY_FUNCTION__.6723__PRETTY_FUNCTION__.6825session_handle_invalid_stream2CSWTCH.92update_remote_initial_window_size_funcsession_close_stream_on_goaway__PRETTY_FUNCTION__.7086nghttp2_session_close_stream_if_shut_rdwr.part.29__PRETTY_FUNCTION__.6887__PRETTY_FUNCTION__.6898update_local_initial_window_size_funcsession_is_closingsession_predicate_for_stream_sendnghttp2_session_predicate_data_send__PRETTY_FUNCTION__.6986session_after_frame_sent2session_terminate_session.part.34session_handle_invalid_connectionsession_inflate_handle_invalid_connection__PRETTY_FUNCTION__.7364__PRETTY_FUNCTION__.7371session_process_headers_frame__PRETTY_FUNCTION__.7569__PRETTY_FUNCTION__.7390session_update_consumed_sizesession_update_connection_consumed_sizesession_update_stream_consumed_sizesession_after_frame_sent1__PRETTY_FUNCTION__.7122__PRETTY_FUNCTION__.7871nghttp2_session_upgrade_internal__PRETTY_FUNCTION__.7895__PRETTY_FUNCTION__.6790nghttp2_session_mem_send_internal__PRETTY_FUNCTION__.7029__PRETTY_FUNCTION__.7018__PRETTY_FUNCTION__.7183__PRETTY_FUNCTION__.6943__PRETTY_FUNCTION__.6928__PRETTY_FUNCTION__.6952__PRETTY_FUNCTION__.7202__PRETTY_FUNCTION__.7913__PRETTY_FUNCTION__.7972__PRETTY_FUNCTION__.7985__PRETTY_FUNCTION__.8007__PRETTY_FUNCTION__.8017static_in__PRETTY_FUNCTION__.7722__PRETTY_FUNCTION__.7497__PRETTY_FUNCTION__.7343__PRETTY_FUNCTION__.7335__PRETTY_FUNCTION__.7800nghttp2_helper.cDOWNCASE_TBL__PRETTY_FUNCTION__.4681VALID_HD_NAME_CHARSVALID_HD_VALUE_CHARSVALID_METHOD_CHARSVALID_PATH_CHARSVALID_AUTHORITY_CHARSnghttp2_alpn.cnghttp2_hd.cencode_lengthlookup_tokenemit_string__PRETTY_FUNCTION__.5202hd_inflate_read_huffhd_ringbuf_get__PRETTY_FUNCTION__.5064nghttp2_hd_table_get2static_table__PRETTY_FUNCTION__.5307hd_ringbuf_freehd_ringbuf_pop_back.isra.6.part.7__PRETTY_FUNCTION__.5097hd_context_shrink_table_sizepack_first_byte__PRETTY_FUNCTION__.5210emit_indname_block.isra.14hd_inflate_read_len.constprop.19add_hd_table_incrementalhd_inflate_commit_newname__PRETTY_FUNCTION__.5300hd_inflate_commit_indnamenghttp2_hd_huffman.cnghttp2_hd_huffman_data.cnghttp2_version.cnghttp2_priority_spec.cnghttp2_option.cnghttp2_callbacks.cnghttp2_mem.cdefault_reallocdefault_callocdefault_freedefault_mallocnghttp2_http.cmemieqparse_uintnghttp2_rcbuf.c__PRETTY_FUNCTION__.4072nghttp2_extpri.cnghttp2_ratelim.cnghttp2_time.cnghttp2_debug.csfparse.cparser_discard_owsparser_keyparser_next_key_or_itemparser_number__PRETTY_FUNCTION__.2930parser_bare_item__PRETTY_FUNCTION__.3398parser_skip_paramsparser_skip_inner_list__PRETTY_FUNCTION__.3408__PRETTY_FUNCTION__.3372__PRETTY_FUNCTION__.3382__PRETTY_FUNCTION__.3430__PRETTY_FUNCTION__.3442__PRETTY_FUNCTION__.3454index_tbl.3475__PRETTY_FUNCTION__.3482__FRAME_END____JCR_END__nghttp2_extpri_to_uint8nghttp2_frame_pack_pingnghttp2_session_get_next_ob_itemnghttp2_queue_popnghttp2_queue_freenghttp2_frame_pack_headersnghttp2_http_on_request_headersnghttp2_frame_headers_payload_nv_offsetnghttp2_session_pop_next_ob_itemnghttp2_frame_unpack_priority_specnghttp2_frame_hd_initnghttp2_enable_strict_prefacenghttp2_session_on_push_response_headers_receivednghttp2_stream_dep_find_ancestornghttp2_stream_in_dep_treenghttp2_frame_ping_initnghttp2_bufs_initnghttp2_session_add_itemnghttp2_bufs_resetnghttp2_frame_unpack_altsvc_payloadnghttp2_session_update_local_settingsnghttp2_frame_priority_update_initnghttp2_rcbuf_newnghttp2_pq_topnghttp2_frame_unpack_goaway_payload2nghttp2_frame_unpack_frame_hdnghttp2_hd_inflate_freenghttp2_frame_headers_freenghttp2_session_get_streamnghttp2_session_close_stream_if_shut_rdwrnghttp2_frame_settings_freenghttp2_stream_check_deferred_by_flow_controlnghttp2_stream_reschedulenghttp2_outbound_item_initnghttp2_bufs_lennghttp2_map_print_distancenghttp2_hd_deflate_hd_bufsnghttp2_session_terminate_session_with_reasonnghttp2_map_initnghttp2_queue_pushnghttp2_priority_spec_normalize_weightnghttp2_bufs_freenghttp2_session_update_recv_connection_window_sizenghttp2_frame_window_update_freenghttp2_session_adjust_closed_streamnghttp2_frame_data_initnghttp2_frame_altsvc_initnghttp2_hd_huff_encodenghttp2_frame_origin_initnghttp2_stream_dep_addnghttp2_bufs_remove_copynghttp2_frame_unpack_origin_payloadnghttp2_hd_huff_decode_context_initnghttp2_hd_emit_newname_blocknghttp2_map_clearnghttp2_session_update_recv_stream_window_sizenghttp2_bufs_addbnghttp2_put_uint16benghttp2_session_adjust_idle_streamnghttp2_queue_backnghttp2_session_on_ping_receivednghttp2_adjust_local_window_sizenghttp2_data_provider_wrap_v1nghttp2_hd_huff_decodenghttp2_hd_emit_table_sizesf_parser_paramnghttp2_session_on_response_headers_receivednghttp2_frame_iv_copynghttp2_session_add_rst_streamnghttp2_frame_priority_lennghttp2_pq_popnghttp2_stream_promise_fulfillednghttp2_session_on_altsvc_receivednghttp2_pq_initnghttp2_time_now_secnghttp2_frame_pack_goawaynghttp2_frame_unpack_settings_payload2sf_parser_initnghttp2_queue_frontnghttp2_frame_unpack_window_update_payloadnghttp2_frame_settings_inithuff_sym_tablenghttp2_get_uint16nghttp2_nv_equalnghttp2_pq_pushsf_base64decodenghttp2_frame_extension_freenghttp2_frame_pack_priority_updatenghttp2_pq_emptynghttp2_frame_unpack_priority_update_payloadnghttp2_pq_sizenghttp2_frame_headers_initnghttp2_stream_freenghttp2_frame_pack_rst_streamnghttp2_session_add_goawaynghttp2_queue_initnghttp2_session_on_priority_update_receivedsf_parser_dictnghttp2_frame_unpack_headers_payloadnghttp2_session_close_streamnghttp2_frame_priority_initnghttp2_map_eachnghttp2_frame_data_freehuff_decode_tablenghttp2_buf_initnghttp2_session_pack_datanghttp2_frame_pack_originnghttp2_frame_push_promise_freenghttp2_hd_entry_freenghttp2_frame_unpack_push_promise_payloadsf_parser_listnghttp2_stream_defer_itemnghttp2_session_on_goaway_receivednghttp2_extpri_from_uint8nghttp2_stream_update_remote_initial_window_sizenghttp2_bufs_wrap_init2nghttp2_hd_entry_initnghttp2_frame_window_update_initnghttp2_http_on_headernghttp2_session_on_window_update_receivednghttp2_session_on_rst_stream_receivednghttp2_session_destroy_streamnghttp2_should_send_window_updatenghttp2_frame_unpack_settings_entrynghttp2_mem_reallocnghttp2_bufs_init3nghttp2_bufs_advancenghttp2_http_on_remote_end_streamnghttp2_hd_huff_encode_countnghttp2_hd_inflate_initnghttp2_bufs_addsf_unescape__dso_handlenghttp2_stream_update_local_initial_window_sizesf_parser_itemnghttp2_session_on_headers_receivednghttp2_session_is_my_stream_idnghttp2_session_get_stream_rawnghttp2_session_on_origin_receivednghttp2_frame_rst_stream_initnghttp2_outbound_queue_pushnghttp2_mem_mallocnghttp2_stream_detach_itemnghttp2_stream_dep_insertnghttp2_outbound_queue_popnghttp2_frame_pack_settingsnghttp2_session_detach_idle_streamnghttp2_nv_array_copynghttp2_frame_unpack_settings_payloadnghttp2_stream_attach_itemnghttp2_hd_inflate_hd_nvnghttp2_get_uint32nghttp2_iv_checknghttp2_http_parse_prioritynghttp2_outbound_item_freenghttp2_http_on_response_headersnghttp2_buf_freenghttp2_session_open_streamnghttp2_session_on_priority_receivednghttp2_session_add_pingnghttp2_buf_wrap_initnghttp2_stream_dep_add_subtreenghttp2_ratelim_initnghttp2_stream_dep_removenghttp2_bufs_reallocnghttp2_increase_local_window_sizenghttp2_frame_extension_initnghttp2_session_add_window_updatenghttp2_frame_priority_freenghttp2_frame_priority_update_freenghttp2_map_removenghttp2_session_on_request_headers_receivednghttp2_hd_emit_indname_blocknghttp2_buf_resetnghttp2_hd_table_getnghttp2_stream_dep_insert_subtreenghttp2_pq_freenghttp2_hd_deflate_init2nghttp2_frame_pack_push_promisenghttp2_outbound_queue_initnghttp2_frame_unpack_altsvc_payload2nghttp2_frame_pack_window_updatenghttp2_http_record_request_methodnghttp2_put_uint32benghttp2_downcasenghttp2_queue_emptynghttp2_hd_deflate_initnghttp2_stream_change_weightnghttp2_stream_initnghttp2_data_provider_wrap_v2nghttp2_frame_goaway_initnghttp2_frame_add_padnghttp2_frame_unpack_priority_payloadnghttp2_bufs_next_presentnghttp2_session_keep_closed_stream_DYNAMICnghttp2_nv_array_delnghttp2_hd_deflate_freenghttp2_stream_check_deferred_itemnghttp2_map_insertnghttp2_frame_push_promise_initnghttp2_frame_altsvc_freenghttp2_frame_pack_frame_hdnghttp2_session_keep_idle_streamnghttp2_session_on_settings_receivednghttp2_http_on_data_chunknghttp2_frame_pack_settings_payloadnghttp2_bufs_orbnghttp2_frame_pack_priority_specnghttp2_frame_rst_stream_freenghttp2_frame_unpack_ping_payloadnghttp2_session_on_data_receivednghttp2_mem_callocnghttp2_nv_array_sortnghttp2_session_on_push_promise_receivednghttp2_bufs_addb_holdnghttp2_rcbuf_delnghttp2_submit_data_sharednghttp2_map_freenghttp2_cpymemnghttp2_stream_next_outbound_itemnghttp2_frame_trail_padlennghttp2_rcbuf_new2nghttp2_frame_pack_prioritynghttp2_pq_eachnghttp2_frame_pack_altsvcnghttp2_frame_origin_free__GNU_EH_FRAME_HDRnghttp2_bufs_orb_holdnghttp2_mem_free__TMC_END___GLOBAL_OFFSET_TABLE_nghttp2_ratelim_drainnghttp2_mem_defaultnghttp2_hd_decode_lengthnghttp2_bufs_wrap_initnghttp2_hd_huff_decode_failure_statenghttp2_http_on_trailer_headersnghttp2_buf_init2nghttp2_frame_ping_freenghttp2_frame_goaway_freenghttp2_buf_reservenghttp2_stream_dep_distributed_weightsf_parser_inner_listnghttp2_bufs_seek_last_presentnghttp2_session_reprioritize_streamnghttp2_ratelim_updatenghttp2_frame_unpack_rst_stream_payloadnghttp2_map_each_freenghttp2_pq_removenghttp2_bufs_wrap_freenghttp2_mem_free2nghttp2_stream_shutdownnghttp2_bufs_removenghttp2_bufs_init2nghttp2_map_sizenghttp2_frame_unpack_goaway_payloadnghttp2_map_findnghttp2_stream_dep_remove_subtreenghttp2_pq_updatenghttp2_stream_resume_deferred_itemnghttp2_session_add_settingsnghttp2_session_callbacks_set_on_frame_send_callbacknghttp2_submit_trailernghttp2_stream_get_next_siblingnghttp2_session_callbacks_set_pack_extension_callback2nghttp2_option_set_max_deflate_dynamic_table_sizenghttp2_session_callbacks_set_on_header_callbackfree@@GLIBC_2.2.5nghttp2_submit_pingnghttp2_option_newnghttp2_hd_deflate_get_num_table_entriesnghttp2_submit_window_updatenghttp2_session_callbacks_set_recv_callback2nghttp2_session_get_root_stream_ITM_deregisterTMCloneTablenghttp2_rcbuf_is_staticnghttp2_rcbuf_decrefnghttp2_session_mem_recvnghttp2_hd_deflate_hd_vecnghttp2_session_callbacks_set_on_invalid_frame_recv_callbacknghttp2_session_callbacks_set_send_callback2nghttp2_option_set_peer_max_concurrent_streamsnghttp2_submit_responsenghttp2_session_server_newnghttp2_hd_deflate_hdqsort@@GLIBC_2.2.5nghttp2_check_header_valuenghttp2_extpri_parse_priorityvsnprintf@@GLIBC_2.2.5nghttp2_option_set_builtin_recv_extension_typenghttp2_submit_goawaynghttp2_check_pathnghttp2_session_get_stream_remote_window_sizenghttp2_hd_inflate_newclock_gettime@@GLIBC_2.17nghttp2_session_get_stream_local_window_sizenghttp2_session_mem_recv2_edatanghttp2_stream_get_first_childnghttp2_check_header_namenghttp2_session_callbacks_set_on_data_chunk_recv_callbacknghttp2_hd_inflate_hd3nghttp2_session_set_next_stream_idnghttp2_session_get_stream_effective_recv_data_lengthnghttp2_option_set_stream_reset_rate_limitnghttp2_session_terminate_sessionnghttp2_session_client_new2nghttp2_session_get_extpri_stream_prioritynghttp2_session_callbacks_set_on_invalid_header_callback2nghttp2_pack_settings_payloadnghttp2_session_get_stream_effective_local_window_sizenghttp2_option_set_max_continuations_finistrlen@@GLIBC_2.2.5nghttp2_session_get_local_window_sizenghttp2_hd_inflate_get_dynamic_table_sizenghttp2_nv_compare_namenghttp2_session_get_hd_inflate_dynamic_table_sizenghttp2_session_callbacks_set_on_header_callback2nghttp2_session_get_stream_local_closenghttp2_hd_deflate_boundnghttp2_session_callbacks_set_select_padding_callbacknghttp2_session_terminate_session2nghttp2_hd_deflate_get_table_entrynghttp2_session_callbacks_set_on_begin_headers_callbacknghttp2_session_callbacks_set_select_padding_callback2__assert_fail@@GLIBC_2.2.5nghttp2_hd_deflate_get_max_dynamic_table_sizenghttp2_session_get_effective_local_window_sizenghttp2_http2_strerrornghttp2_session_check_request_allowednghttp2_hd_deflate_new2nghttp2_option_set_user_recv_extension_typenghttp2_session_set_stream_user_datamemset@@GLIBC_2.2.5nghttp2_session_create_idle_streamnghttp2_stream_get_previous_siblingnghttp2_submit_request2nghttp2_submit_priority_updatenghttp2_session_callbacks_set_error_callbacknghttp2_submit_headersnghttp2_session_find_streamnghttp2_hd_deflate_hd_vec2nghttp2_session_sendnghttp2_priority_spec_initnghttp2_session_client_newnghttp2_submit_extensionnghttp2_hd_inflate_new2nghttp2_session_callbacks_set_on_stream_close_callbacknghttp2_option_set_server_fallback_rfc7540_prioritiesnghttp2_stream_get_sum_dependency_weightmemchr@@GLIBC_2.2.5nghttp2_stream_get_stream_idnghttp2_session_callbacks_delmemcmp@@GLIBC_2.2.5nghttp2_session_get_hd_deflate_dynamic_table_sizenghttp2_priority_spec_default_initnghttp2_option_set_max_send_header_block_lengthnghttp2_select_alpnnghttp2_session_server_new2calloc@@GLIBC_2.2.5nghttp2_session_consumenghttp2_session_callbacks_set_on_invalid_header_callbacknghttp2_stream_get_parentnghttp2_option_delnghttp2_hd_inflate_get_num_table_entriesnghttp2_option_set_no_recv_client_magicfprintf@@GLIBC_2.2.5nghttp2_option_set_max_reserved_remote_streamsnghttp2_session_callbacks_set_send_callbacknghttp2_session_resume_datanghttp2_hd_deflate_newnghttp2_session_get_remote_window_size__gmon_start__nghttp2_check_authoritynghttp2_session_set_local_window_sizenghttp2_hd_inflate_end_headersnghttp2_submit_push_promisenghttp2_session_callbacks_set_on_frame_recv_callbackmemcpy@@GLIBC_2.14nghttp2_hd_deflate_hd2nghttp2_option_set_no_http_messagingnghttp2_session_callbacks_set_pack_extension_callbacktime@@GLIBC_2.2.5nghttp2_hd_inflate_get_table_entrynghttp2_session_callbacks_set_recv_callbacknghttp2_session_consume_connectionnghttp2_submit_requestnghttp2_check_header_value_rfc9113nghttp2_session_change_stream_prioritynghttp2_session_callbacks_set_unpack_extension_callbackmalloc@@GLIBC_2.2.5nghttp2_session_recvnghttp2_is_fatalnghttp2_option_set_max_settingsnghttp2_versionnghttp2_session_check_server_sessionnghttp2_submit_settingsnghttp2_session_upgrade_endnghttp2_pack_settings_payload2nghttp2_session_consume_streamnghttp2_option_set_no_auto_ping_acknghttp2_strerrornghttp2_option_set_no_closed_streamsnghttp2_session_callbacks_set_on_extension_chunk_recv_callbacknghttp2_select_next_protocolnghttp2_session_get_local_settingsrealloc@@GLIBC_2.2.5__bss_startnghttp2_submit_originnghttp2_hd_deflate_get_dynamic_table_sizenghttp2_check_methodnghttp2_session_get_effective_recv_data_lengthnghttp2_submit_response2nghttp2_hd_inflate_hd2nghttp2_session_want_writenghttp2_submit_altsvcnghttp2_session_client_new3nghttp2_hd_inflate_delnghttp2_session_want_readmemmove@@GLIBC_2.2.5nghttp2_session_change_extpri_stream_prioritynghttp2_option_set_no_auto_window_updatenghttp2_hd_deflate_delnghttp2_submit_rst_streamnghttp2_session_get_stream_user_datanghttp2_session_set_user_datanghttp2_session_callbacks_set_send_data_callbacknghttp2_session_upgrade2nghttp2_priority_spec_check_defaultnghttp2_hd_inflate_hdnghttp2_submit_data2nghttp2_rcbuf_increfnghttp2_session_callbacks_newnghttp2_set_debug_vprintf_callbacknghttp2_session_get_last_proc_stream_idnghttp2_session_mem_send2nghttp2_session_callbacks_set_on_frame_not_send_callback_Jv_RegisterClassesnghttp2_session_mem_sendnghttp2_stream_get_weightnghttp2_session_get_remote_settingsnghttp2_hd_inflate_get_max_dynamic_table_sizenghttp2_stream_get_statenghttp2_session_callbacks_set_error_callback2nghttp2_rcbuf_get_bufnghttp2_option_set_max_outbound_ack_ITM_registerTMCloneTablenghttp2_session_callbacks_set_on_begin_frame_callbacknghttp2_submit_datanghttp2_hd_inflate_change_table_sizenghttp2_session_callbacks_set_before_frame_send_callbacknghttp2_session_delnghttp2_session_server_new3nghttp2_session_get_outbound_queue_sizenghttp2_session_get_stream_remote_closenghttp2_hd_deflate_change_table_size__cxa_finalize@@GLIBC_2.2.5nghttp2_session_callbacks_set_data_source_read_length_callback2nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validationnghttp2_session_get_next_stream_idnghttp2_submit_prioritynghttp2_submit_shutdown_noticestderr@@GLIBC_2.2.5nghttp2_session_callbacks_set_data_source_read_length_callback.symtab.strtab.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.jcr.data.rel.ro.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_info.debug_abbrev.debug_line.debug_str.debug_loc.debug_ranges$.o|8 pph@Ho44Uo@6@6@d66HnBNNxSSsSSP~ W WQ$$ @@H ::\JJWH"HP"PX"X`"` ""0""h ("(0(-UE=5 D(P'l40?tClJ `J@6 (D"  hz 5I XPK8hZ*plib/libnghttp2.lanuȯ# libnghttp2.la - a libtool library file # Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-15build2 # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='libnghttp2.so.14' # Names of this library. library_names='libnghttp2.so.14.28.0 libnghttp2.so.14 libnghttp2.so' # The name of the static archive. old_library='libnghttp2.a' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='' # Libraries that this one depends upon. dependency_libs='' # Names of additional weak libraries provided by this library weak_library_names='' # Version information for libnghttp2. current=42 age=28 revision=0 # Is this an already installed library? installed=yes # Should we warn about portability when linking against -modules? shouldnotlink=no # Files to dlopen/dlpreopen dlopen='' dlpreopen='' # Directory that this library needs to be installed in: libdir='/opt/cpanel/nghttp2/lib' PK8hZ!uulib/pkgconfig/libnghttp2.pcnu[# nghttp2 - HTTP/2 C Library # Copyright (c) 2012, 2013 Tatsuhiro Tsujikawa # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. prefix=/opt/cpanel/nghttp2 exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: libnghttp2 Description: HTTP/2 C library URL: https://github.com/tatsuhiro-t/nghttp2 Version: 1.61.0 Libs: -L${libdir} -lnghttp2 Cflags: -I${includedir} PK8hZrHVVlib/libnghttp2.anu[! / 1713297051 0 0 0 15018 ` <6<6<6<6<6<6<6<6<6<6LrLrLrLrLrLrLrLrLrLr```````m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m2m222222222222222222222222222222222#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:>>>>>>>>>>>>>>>>>>>>>>>>                                       ~~~~~                   //////////////////////////////EEEEEEOOOOOOOO|||||||:::nghttp2_pq_initnghttp2_pq_freenghttp2_pq_pushnghttp2_pq_topnghttp2_pq_popnghttp2_pq_removenghttp2_pq_emptynghttp2_pq_sizenghttp2_pq_updatenghttp2_pq_eachnghttp2_map_initnghttp2_map_freenghttp2_map_each_freenghttp2_map_eachnghttp2_map_print_distancenghttp2_map_insertnghttp2_map_findnghttp2_map_removenghttp2_map_clearnghttp2_map_sizenghttp2_queue_initnghttp2_queue_freenghttp2_queue_pushnghttp2_queue_popnghttp2_queue_frontnghttp2_queue_backnghttp2_queue_emptynghttp2_frame_pack_frame_hdnghttp2_frame_unpack_frame_hdnghttp2_frame_hd_initnghttp2_frame_headers_initnghttp2_frame_headers_freenghttp2_frame_priority_initnghttp2_frame_priority_freenghttp2_frame_rst_stream_initnghttp2_frame_rst_stream_freenghttp2_frame_settings_initnghttp2_frame_settings_freenghttp2_frame_push_promise_initnghttp2_frame_push_promise_freenghttp2_frame_ping_initnghttp2_frame_ping_freenghttp2_frame_goaway_initnghttp2_frame_goaway_freenghttp2_frame_window_update_initnghttp2_frame_window_update_freenghttp2_frame_trail_padlennghttp2_frame_data_initnghttp2_frame_data_freenghttp2_frame_extension_initnghttp2_frame_extension_freenghttp2_frame_altsvc_initnghttp2_frame_altsvc_freenghttp2_frame_origin_initnghttp2_frame_origin_freenghttp2_frame_priority_update_initnghttp2_frame_priority_update_freenghttp2_frame_priority_lennghttp2_frame_headers_payload_nv_offsetnghttp2_frame_pack_priority_specnghttp2_frame_pack_headersnghttp2_frame_unpack_priority_specnghttp2_frame_unpack_headers_payloadnghttp2_frame_pack_prioritynghttp2_frame_unpack_priority_payloadnghttp2_frame_pack_rst_streamnghttp2_frame_unpack_rst_stream_payloadnghttp2_frame_pack_settings_payloadnghttp2_frame_pack_settingsnghttp2_frame_unpack_settings_payloadnghttp2_frame_unpack_settings_entrynghttp2_frame_unpack_settings_payload2nghttp2_frame_pack_push_promisenghttp2_frame_unpack_push_promise_payloadnghttp2_frame_pack_pingnghttp2_frame_unpack_ping_payloadnghttp2_frame_pack_goawaynghttp2_frame_unpack_goaway_payloadnghttp2_frame_unpack_goaway_payload2nghttp2_frame_pack_window_updatenghttp2_frame_unpack_window_update_payloadnghttp2_frame_pack_altsvcnghttp2_frame_unpack_altsvc_payloadnghttp2_frame_unpack_altsvc_payload2nghttp2_frame_pack_originnghttp2_frame_unpack_origin_payloadnghttp2_frame_pack_priority_updatenghttp2_frame_unpack_priority_update_payloadnghttp2_frame_iv_copynghttp2_nv_equalnghttp2_nv_array_delnghttp2_nv_compare_namenghttp2_nv_array_sortnghttp2_nv_array_copynghttp2_iv_checknghttp2_frame_add_padnghttp2_buf_initnghttp2_buf_freenghttp2_buf_reservenghttp2_buf_init2nghttp2_buf_resetnghttp2_buf_wrap_initnghttp2_bufs_init3nghttp2_bufs_init2nghttp2_bufs_initnghttp2_bufs_freenghttp2_bufs_reallocnghttp2_bufs_wrap_initnghttp2_bufs_wrap_init2nghttp2_bufs_wrap_freenghttp2_bufs_seek_last_presentnghttp2_bufs_lennghttp2_bufs_addnghttp2_bufs_addbnghttp2_bufs_addb_holdnghttp2_bufs_orbnghttp2_bufs_orb_holdnghttp2_bufs_removenghttp2_bufs_remove_copynghttp2_bufs_resetnghttp2_bufs_advancenghttp2_bufs_next_presentnghttp2_stream_initnghttp2_stream_freenghttp2_stream_shutdownnghttp2_stream_reschedulenghttp2_stream_change_weightnghttp2_stream_dep_distributed_weightnghttp2_stream_attach_itemnghttp2_stream_detach_itemnghttp2_stream_defer_itemnghttp2_stream_resume_deferred_itemnghttp2_stream_check_deferred_itemnghttp2_stream_check_deferred_by_flow_controlnghttp2_stream_update_remote_initial_window_sizenghttp2_stream_update_local_initial_window_sizenghttp2_stream_promise_fulfillednghttp2_stream_dep_find_ancestornghttp2_stream_dep_insertnghttp2_stream_dep_addnghttp2_stream_dep_removenghttp2_stream_dep_insert_subtreenghttp2_stream_dep_add_subtreenghttp2_stream_dep_remove_subtreenghttp2_stream_in_dep_treenghttp2_stream_next_outbound_itemnghttp2_stream_get_statenghttp2_stream_get_parentnghttp2_stream_get_next_siblingnghttp2_stream_get_previous_siblingnghttp2_stream_get_first_childnghttp2_stream_get_weightnghttp2_stream_get_sum_dependency_weightnghttp2_stream_get_stream_idnghttp2_data_provider_wrap_v1nghttp2_data_provider_wrap_v2nghttp2_outbound_item_initnghttp2_outbound_item_freenghttp2_outbound_queue_initnghttp2_outbound_queue_pushnghttp2_outbound_queue_popnghttp2_enable_strict_prefacenghttp2_is_fatalnghttp2_session_is_my_stream_idnghttp2_session_get_streamnghttp2_session_get_stream_rawnghttp2_session_client_new3nghttp2_session_client_newnghttp2_session_client_new2nghttp2_session_server_new3nghttp2_session_server_newnghttp2_session_server_new2nghttp2_session_delnghttp2_session_open_streamnghttp2_session_reprioritize_streamnghttp2_session_add_itemnghttp2_session_add_rst_streamnghttp2_session_destroy_streamnghttp2_session_close_streamnghttp2_session_keep_closed_streamnghttp2_session_keep_idle_streamnghttp2_session_detach_idle_streamnghttp2_session_adjust_closed_streamnghttp2_session_adjust_idle_streamnghttp2_session_close_stream_if_shut_rdwrnghttp2_session_get_next_ob_itemnghttp2_session_pop_next_ob_itemnghttp2_session_update_local_settingsnghttp2_session_on_altsvc_receivednghttp2_session_on_origin_receivednghttp2_session_on_data_receivednghttp2_session_want_readnghttp2_session_want_writenghttp2_session_check_request_allowednghttp2_session_add_pingnghttp2_session_add_goawaynghttp2_session_terminate_sessionnghttp2_session_terminate_session2nghttp2_session_terminate_session_with_reasonnghttp2_session_on_request_headers_receivednghttp2_session_on_response_headers_receivednghttp2_session_on_push_response_headers_receivednghttp2_session_on_headers_receivednghttp2_session_on_push_promise_receivednghttp2_session_on_ping_receivednghttp2_session_on_goaway_receivednghttp2_session_on_window_update_receivednghttp2_session_on_priority_update_receivednghttp2_session_on_priority_receivednghttp2_session_on_rst_stream_receivednghttp2_session_add_window_updatenghttp2_session_update_recv_stream_window_sizenghttp2_session_update_recv_connection_window_sizenghttp2_session_add_settingsnghttp2_session_on_settings_receivednghttp2_session_pack_datanghttp2_session_mem_send2nghttp2_session_mem_sendnghttp2_session_sendnghttp2_session_get_stream_user_datanghttp2_session_set_stream_user_datanghttp2_session_resume_datanghttp2_session_get_outbound_queue_sizenghttp2_session_get_stream_effective_recv_data_lengthnghttp2_session_get_stream_effective_local_window_sizenghttp2_session_get_stream_local_window_sizenghttp2_session_get_effective_recv_data_lengthnghttp2_session_get_effective_local_window_sizenghttp2_session_get_local_window_sizenghttp2_session_get_stream_remote_window_sizenghttp2_session_get_remote_window_sizenghttp2_session_get_remote_settingsnghttp2_session_get_local_settingsnghttp2_session_upgradenghttp2_session_upgrade2nghttp2_session_get_stream_local_closenghttp2_session_get_stream_remote_closenghttp2_session_consumenghttp2_session_mem_recv2nghttp2_session_mem_recvnghttp2_session_recvnghttp2_session_consume_connectionnghttp2_session_consume_streamnghttp2_session_set_next_stream_idnghttp2_session_get_next_stream_idnghttp2_session_get_last_proc_stream_idnghttp2_session_find_streamnghttp2_session_get_root_streamnghttp2_session_check_server_sessionnghttp2_session_change_stream_prioritynghttp2_session_create_idle_streamnghttp2_session_get_hd_inflate_dynamic_table_sizenghttp2_session_get_hd_deflate_dynamic_table_sizenghttp2_session_set_user_datanghttp2_session_change_extpri_stream_prioritynghttp2_session_get_extpri_stream_prioritynghttp2_submit_trailernghttp2_submit_headersnghttp2_submit_pingnghttp2_submit_prioritynghttp2_submit_rst_streamnghttp2_submit_goawaynghttp2_submit_shutdown_noticenghttp2_submit_settingsnghttp2_submit_push_promisenghttp2_submit_window_updatenghttp2_session_set_local_window_sizenghttp2_submit_altsvcnghttp2_submit_originnghttp2_submit_priority_updatenghttp2_submit_requestnghttp2_submit_request2nghttp2_submit_responsenghttp2_submit_response2nghttp2_submit_data_sharednghttp2_submit_datanghttp2_submit_data2nghttp2_pack_settings_payload2nghttp2_pack_settings_payloadnghttp2_submit_extensionnghttp2_put_uint16benghttp2_put_uint32benghttp2_get_uint16nghttp2_get_uint32nghttp2_downcasenghttp2_adjust_local_window_sizenghttp2_increase_local_window_sizenghttp2_should_send_window_updatenghttp2_strerrornghttp2_check_header_namenghttp2_check_header_valuenghttp2_check_header_value_rfc9113nghttp2_check_methodnghttp2_check_pathnghttp2_check_authoritynghttp2_cpymemnghttp2_http2_strerrornghttp2_select_next_protocolnghttp2_select_alpnnghttp2_hd_entry_initnghttp2_hd_entry_freenghttp2_hd_deflate_init2nghttp2_hd_deflate_initnghttp2_hd_inflate_initnghttp2_hd_deflate_freenghttp2_hd_inflate_freenghttp2_hd_deflate_change_table_sizenghttp2_hd_inflate_change_table_sizenghttp2_hd_table_getnghttp2_hd_deflate_hd_bufsnghttp2_hd_deflate_hd2nghttp2_hd_deflate_hdnghttp2_hd_deflate_hd_vec2nghttp2_hd_deflate_hd_vecnghttp2_hd_deflate_boundnghttp2_hd_deflate_new2nghttp2_hd_deflate_newnghttp2_hd_deflate_delnghttp2_hd_inflate_hd_nvnghttp2_hd_inflate_hd3nghttp2_hd_inflate_hd2nghttp2_hd_inflate_hdnghttp2_hd_inflate_end_headersnghttp2_hd_inflate_new2nghttp2_hd_inflate_newnghttp2_hd_inflate_delnghttp2_hd_emit_indname_blocknghttp2_hd_emit_newname_blocknghttp2_hd_emit_table_sizenghttp2_hd_decode_lengthnghttp2_hd_deflate_get_num_table_entriesnghttp2_hd_deflate_get_table_entrynghttp2_hd_deflate_get_dynamic_table_sizenghttp2_hd_deflate_get_max_dynamic_table_sizenghttp2_hd_inflate_get_num_table_entriesnghttp2_hd_inflate_get_table_entrynghttp2_hd_inflate_get_dynamic_table_sizenghttp2_hd_inflate_get_max_dynamic_table_sizenghttp2_hd_huff_encode_countnghttp2_hd_huff_encodenghttp2_hd_huff_decode_context_initnghttp2_hd_huff_decodenghttp2_hd_huff_decode_failure_statehuff_decode_tablehuff_sym_tablenghttp2_versionnghttp2_priority_spec_initnghttp2_priority_spec_default_initnghttp2_priority_spec_check_defaultnghttp2_priority_spec_normalize_weightnghttp2_option_newnghttp2_option_delnghttp2_option_set_no_auto_window_updatenghttp2_option_set_peer_max_concurrent_streamsnghttp2_option_set_no_recv_client_magicnghttp2_option_set_no_http_messagingnghttp2_option_set_max_reserved_remote_streamsnghttp2_option_set_user_recv_extension_typenghttp2_option_set_builtin_recv_extension_typenghttp2_option_set_no_auto_ping_acknghttp2_option_set_max_send_header_block_lengthnghttp2_option_set_max_deflate_dynamic_table_sizenghttp2_option_set_no_closed_streamsnghttp2_option_set_max_outbound_acknghttp2_option_set_max_settingsnghttp2_option_set_server_fallback_rfc7540_prioritiesnghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validationnghttp2_option_set_stream_reset_rate_limitnghttp2_option_set_max_continuationsnghttp2_session_callbacks_newnghttp2_session_callbacks_delnghttp2_session_callbacks_set_send_callbacknghttp2_session_callbacks_set_send_callback2nghttp2_session_callbacks_set_recv_callbacknghttp2_session_callbacks_set_recv_callback2nghttp2_session_callbacks_set_on_frame_recv_callbacknghttp2_session_callbacks_set_on_invalid_frame_recv_callbacknghttp2_session_callbacks_set_on_data_chunk_recv_callbacknghttp2_session_callbacks_set_before_frame_send_callbacknghttp2_session_callbacks_set_on_frame_send_callbacknghttp2_session_callbacks_set_on_frame_not_send_callbacknghttp2_session_callbacks_set_on_stream_close_callbacknghttp2_session_callbacks_set_on_begin_headers_callbacknghttp2_session_callbacks_set_on_header_callbacknghttp2_session_callbacks_set_on_header_callback2nghttp2_session_callbacks_set_on_invalid_header_callbacknghttp2_session_callbacks_set_on_invalid_header_callback2nghttp2_session_callbacks_set_select_padding_callbacknghttp2_session_callbacks_set_select_padding_callback2nghttp2_session_callbacks_set_data_source_read_length_callbacknghttp2_session_callbacks_set_data_source_read_length_callback2nghttp2_session_callbacks_set_on_begin_frame_callbacknghttp2_session_callbacks_set_send_data_callbacknghttp2_session_callbacks_set_pack_extension_callbacknghttp2_session_callbacks_set_pack_extension_callback2nghttp2_session_callbacks_set_unpack_extension_callbacknghttp2_session_callbacks_set_on_extension_chunk_recv_callbacknghttp2_session_callbacks_set_error_callbacknghttp2_session_callbacks_set_error_callback2nghttp2_mem_defaultnghttp2_mem_mallocnghttp2_mem_freenghttp2_mem_free2nghttp2_mem_callocnghttp2_mem_reallocnghttp2_http_on_request_headersnghttp2_http_on_response_headersnghttp2_http_on_trailer_headersnghttp2_http_on_remote_end_streamnghttp2_http_on_data_chunknghttp2_http_record_request_methodnghttp2_http_parse_prioritynghttp2_http_on_headernghttp2_rcbuf_newnghttp2_rcbuf_new2nghttp2_rcbuf_delnghttp2_rcbuf_increfnghttp2_rcbuf_decrefnghttp2_rcbuf_get_bufnghttp2_rcbuf_is_staticnghttp2_extpri_to_uint8nghttp2_extpri_from_uint8nghttp2_extpri_parse_prioritynghttp2_ratelim_initnghttp2_ratelim_updatenghttp2_ratelim_drainnghttp2_time_now_secnghttp2_set_debug_vprintf_callbacksf_parser_inner_listsf_parser_paramsf_parser_dictsf_parser_listsf_parser_itemsf_parser_initsf_unescapesf_base64decode// 268 ` nghttp2_stream.o/ nghttp2_outbound_item.o/ nghttp2_session.o/ nghttp2_submit.o/ nghttp2_helper.o/ nghttp2_hd_huffman.o/ nghttp2_hd_huffman_data.o/ nghttp2_version.o/ nghttp2_priority_spec.o/ nghttp2_option.o/ nghttp2_callbacks.o/ nghttp2_extpri.o/ nghttp2_ratelim.o/ nghttp2_pq.o/ 1713297051 399 399 100644 4096 ` ELF> @@ AUATIUHSHHu3UfI$HJ *HHHHI$HH(t'HI$H]HH4Hq[item->index] == itemnghttp2_pq_removeGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx 4wBBD D(D0`(A ABBDTBBE B(D0A8D@z8A0A(B BBB AW(}BDA q ABE  7L AAG [ AAJ H AAF D AAJ D AAE p \BEE E(D0C8D@t 8A0A(B BBBF X8A0A(B BBBH]BED D(F0k (F ABBE D(C ABBw  0  @@Pa`}q7@  ]bubble_upbubble_down__PRETTY_FUNCTION__.4625nghttp2_pq_initnghttp2_pq_freenghttp2_mem_freenghttp2_pq_pushnghttp2_mem_reallocnghttp2_pq_topnghttp2_pq_popnghttp2_pq_remove__assert_failnghttp2_pq_emptynghttp2_pq_sizenghttp2_pq_updatenghttp2_pq_eachL     X @`$@t .symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rodata.comment.note.GNU-stack.rela.eh_frame @ @` &M,M12M(@H0.Qf@a@  X  X  pnghttp2_map.o/ 1713297051 399 399 100644 5144 ` ELF>X@@AVE1ATA̹ )DUnHHSHLZMu;hDRD"ADBLJMEIHIH!HHHLZMt/IƉI)LH!L9rD9Bu[]A\ A^fDD"DB1LJ[]A\A^@AVIAUAպATAUSHHHtlAF1I6t@f.HHLIMtDA DDHu2I6A9^wI~EfEn1I.[]A\A]A^ø{f.HwGGHHG@f.HHtHH0@fDAUIATIUHS1HGt%@HHEHxHtLAՃ9]wH[]A\A]@AUATUHSHHt9Gt2II1DHHEHxHt LAԅu 9]w1H[]A\A]fDATA UHS1HGu?t@D+MD@H=1H$AAщ9]v7HHEHxuH=19]wfH[]A\ATHUHS|GHWAH4H H9vXu<]u$sAi̹y7SH;IEuHC[]A\ËGP%t[]A\@뾹f.H +OLiֹy7IIMI@HtRA9pDWtESE1 @DHAL)IM!M9w)9wtHIL!HHLHGHu[1[1f.AVSH_Htt +OLiƹy7HHLHztPE19rDGEPu$NfDDIAM)MM!M9w!9rt,HIL!HHLHzu[ A^L@HBBM!LHLH~tlMI)Mu[fII)MtJLIHVHIHKT IPK HFL!FHHLH~uH1H_[A^fSWHu[H?H1HC[HGnghttp2_map.c0 == rv@%u data@%u hash=%08x key=%d base=%zu distance=%zu map_resizenghttp2_map_insertGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx @BEP K(e  ABGG N ABB<`BEJ F(A0u (A BBBA "4LBED D(F0p(A ABB4ZBBA D(D0F(A ABB,8BGD F0 AAB8hBDD b ABA P ABE DEC(7BA~ GH B(AK D W  %  >Qbpp"LZp`7(,3map_resize__PRETTY_FUNCTION__.4665__PRETTY_FUNCTION__.4675nghttp2_mem_callocnghttp2_mem_free__assert_failnghttp2_map_initnghttp2_map_freenghttp2_map_each_freenghttp2_map_eachnghttp2_map_print_distancestderrfprintfnghttp2_map_insertnghttp2_map_findnghttp2_map_removenghttp2_map_clearmemsetnghttp2_map_size+M W \ a     # dp<pl`.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rodata.str1.8.rodata.comment.note.GNU-stack.rela.eh_frame @@  &,12(@2@,Op#W0.`u(p@     Dnghttp2_queue.o/1713297051 399 399 100644 3120 ` ELF>@@ HGHHtH?HtSHH_Hu[ff.UHSHHHt5HSH(H@HtHBHC1H[]HCHH[1]ø{fHHt(H9GHPHt HHGHPCfDHHtHPLf.HGHtHPQf1H?nghttp2_queue.cfrontqueue->frontqueue->backnghttp2_queue_backnghttp2_queue_frontnghttp2_queue_popGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx 0$NT4LWADL l AAA K ACA Jq&M'N @ 3 L_$mr@WJ& 'P __PRETTY_FUNCTION__.4027__PRETTY_FUNCTION__.4031__PRETTY_FUNCTION__.4035nghttp2_queue_initnghttp2_queue_freenghttp2_queue_pushmallocnghttp2_queue_pop__assert_failnghttp2_queue_frontnghttp2_queue_backnghttp2_queue_empty(R @       / 9 > #C 4P@ P.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rodata.comment.note.GNU-stack.rela.eh_frame @Z@ &,12/@RH0".QPfPa@    0@pnghttp2_frame.o/1713297051 399 399 100644 22672 ` ELF>T@@HH9HtDr"HHEHfDHHEH@HHHUHSHHHNHUHwH?uHMHUHsH{H[]aH[]fUHSHH6E H{CE CuH[]f.UHSHHHHRHyHA HT$H)H;H$td$ H HHyHEH+H9t^D$ D$ HH9t(H{HC HH)H H{H$HH9uH{HC HD$ H)H H{H$H1[]ff.UHSHHHH}HEC EC %CCH[]ff.H7W O DGG@f.HD$MHG @w WGHGLO(HG0O8tIHGA@G fDHDf.HHw(HHG G wGHHGBGff.@f.HG G wGWfD@f.HIG @w GGHHOHWHf.HHwHHG @w WGHGLGLO O(G,fHHwHHHG @w GGtHHGfHG@f.I@G G GGHwWHOLG G(HHwHHG @w WGOGf@f.1Ht1G H)HHG @w WGHGÐ@f.H@w W OGLGfD@f.JD G G wGHHGHHHL@LHDHGHHtH0Hf@f.Ht@I11ILDHL9JLuHGHG G GGHpH1HGHHtHpH@f.HAG G GGHHG0HPHHHGHHtHpH@f.HH:H?ÐG H:H?UHSHH6}t ECH[]@AUIATUSHHH;_F HHN0HV(HL <MII<HHЃHCHCHC = tGLH{H{uAE uJLHEHEHH[]A\IuLA]DLcH[]A\A]@Hu뫹off.UHHSHH1SHH%[]SHHC uHC(HC0[USHHH;_u;HCH+C HvFHCHHxH{H{ HuHC H[]ù@HUSHHH;_u:HCH+C HvEHCHHxH{uH{ HC H[]ùDSHHC[Df.AUIATE1UHSHHHt.DuHIHuH{HM9uHKDm[]A\HA]@ATUSHH;_uHHSH+S HH;r.HCHxH{Lc HUHuLI1Lc []A\ùfHwHWUHSHHHH}CH[]@AUHIATIHUHHSHHHI$uH1H[]A\A]@H4LHIEt:1I<$u "@IEHID$ tBHHHHI^sID$ HSH3HxI|$ I9.ID$ wI+D$IUH H9u1[]A\A]A^@.AWAVAUATUSHHLwH $u%IFI1H[]A\A]A^A_DHIH9tHH)HIE11f.HL)HLIHtHL)H9Nd IHL9uH^HH<$HJ4"HT$HIt~HT$IFI.L4L9t>LIHtM4$Il$LLHIIL9LpuH1[]A\A]A^A_@H[]A\A]A^A_ø{f.ATIUSHnHHMHCH+C HQH9r;HCHxH{H{ uHC HULHuu[]A\ùATHUHSvHH_HI%HuHCHC[]A\fIHLcHk[]A\ùfATU1SHHt$IHHHtHLHH[H]A\ÐAUATIUHS1HHWH;VtH[]A\A]LoL;nuH?Ht>H6Ht6uH}HtDIt$Ht:L1fHtιfMu mHHHfHNHHwH?f.(AVHIAUIATUSIL$HHE1IN &@P u LPODu HPMDH(L9uK4 HHHIEIE1;HHUHSHUtjHCHEHCHEIH(H(M9C E C uHS1HuNLeHEAHuH}HCMdC uHS1Hu0LeHEAHCMdH3LHCHsLHCfD1[]A\A]A^DH1[]A\A]A^ø{Ht.1f? w$fw!HHH9uݸWy1fDOvf.AVHAUATUHStoHLjHCH+C L9IHs AH~HCHPHSHH{H{wEtI,$AL$ []A\A]A^HCL1Dh H{ Lk ɹnghttp2_frame.cbufs->head == bufs->currv == 0payloadlen >= 4a->namelen == 0a->valuelen == 0((size_t)((buf)->end - (buf)->last)) >= 5((size_t)((buf)->end - (buf)->last)) >= 4((size_t)((buf)->end - (buf)->last)) >= 8((size_t)((buf)->end - (buf)->last)) >= 2 + altsvc->origin_len + altsvc->field_value_len((size_t)((buf)->last - (buf)->pos)) == 9 + frame->hd.length((size_t)((buf)->end - (buf)->last)) >= 4 + priority_update->field_value_len((size_t)((buf)->end - (buf)->last)) >= padlen - 1nghttp2_frame_add_padnghttp2_nv_equalnghttp2_frame_unpack_priority_update_payloadnghttp2_frame_pack_priority_updatenghttp2_frame_pack_originnghttp2_frame_pack_altsvcnghttp2_frame_pack_window_updatenghttp2_frame_pack_goawaynghttp2_frame_pack_pingnghttp2_frame_pack_push_promisenghttp2_frame_pack_settingsnghttp2_frame_pack_rst_streamnghttp2_frame_pack_prioritynghttp2_frame_pack_headersGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx  _Dc I Y G G0@GADG l AAF DAA$t6ADG cAA$ADG0CA$DADJ rAAQ($<Pdx&.9-,@Th|+"I")"0$D,ADG ]AALlBEA A(D0 (D ABIJ M (A ABBE $8AGG XFA/Ac D (|AAD A AAA , (@{AAD @ AAA lAO4\BED D(G0w(F ABE,nBAA M ABA  $,ADJ ZAAL,BHN G(D0Z (A ABBE J (C ABBA 8|BAD m AEF K ABA &Ad(AAD E AAA ,BDA S NDA 4DEBED D(J0e(A ABB,|dBHD K ABA ({AAD @ AAA AT,BDA k ABA $D8RBB G(D0D@e 0A(A BBBA <BBE A(A0 (A BBBE xfBBB B(A0A8DPb 8A0A(B BBBF  8C0A(B BBBE D 8F0A(B BBBA ,<BDA S ABA 4lnBED o ABC Q ABA (?BAC rDB8BBD D(F0N (C ABBH   4 LH yBHE A(A0B (A BBBF J (A BBBA  c< BEB A(D0r (A BBBI _`G9`R@k  `!03#L-ep~P   6D Q1To$&0,@.Lpl9-0@-`E]z+" Ip")""E` ,P@8!</a|}0 @{\ "@ n> d ,  P & 7F h  E d` {  / I m   `f  `n ?6 G \ t    y  c   bytes_comparnv_comparframe_pack_headers_shared.isra.3__PRETTY_FUNCTION__.5938__PRETTY_FUNCTION__.5959__PRETTY_FUNCTION__.5969__PRETTY_FUNCTION__.5979__PRETTY_FUNCTION__.6018__PRETTY_FUNCTION__.6028__PRETTY_FUNCTION__.6039__PRETTY_FUNCTION__.6059__PRETTY_FUNCTION__.6071__PRETTY_FUNCTION__.6099__PRETTY_FUNCTION__.6127__PRETTY_FUNCTION__.6134__PRETTY_FUNCTION__.6146__PRETTY_FUNCTION__.6220memcmpnghttp2_frame_pack_frame_hdnghttp2_put_uint32benghttp2_frame_unpack_frame_hdnghttp2_get_uint32nghttp2_frame_hd_initnghttp2_frame_headers_initnghttp2_priority_spec_default_initnghttp2_frame_headers_freenghttp2_mem_freenghttp2_frame_priority_initnghttp2_frame_priority_freenghttp2_frame_rst_stream_initnghttp2_frame_rst_stream_freenghttp2_frame_settings_initnghttp2_frame_settings_freenghttp2_frame_push_promise_initnghttp2_frame_push_promise_freenghttp2_frame_ping_initnghttp2_frame_ping_freenghttp2_frame_goaway_initnghttp2_frame_goaway_freenghttp2_frame_window_update_initnghttp2_frame_window_update_freenghttp2_frame_trail_padlennghttp2_frame_data_initnghttp2_frame_data_freenghttp2_frame_extension_initnghttp2_frame_extension_freenghttp2_frame_altsvc_initnghttp2_frame_altsvc_freenghttp2_frame_origin_initnghttp2_frame_origin_freenghttp2_frame_priority_update_initnghttp2_frame_priority_update_freenghttp2_frame_priority_lennghttp2_frame_headers_payload_nv_offsetnghttp2_frame_pack_priority_specnghttp2_frame_pack_headersnghttp2_hd_deflate_hd_bufsnghttp2_bufs_len__assert_failnghttp2_frame_unpack_priority_specnghttp2_priority_spec_initnghttp2_frame_unpack_headers_payloadnghttp2_frame_pack_prioritynghttp2_frame_unpack_priority_payloadnghttp2_frame_pack_rst_streamnghttp2_frame_unpack_rst_stream_payloadnghttp2_frame_pack_settings_payloadnghttp2_put_uint16benghttp2_frame_pack_settingsnghttp2_frame_unpack_settings_payloadnghttp2_frame_unpack_settings_entrynghttp2_get_uint16nghttp2_frame_unpack_settings_payload2nghttp2_mem_mallocnghttp2_frame_pack_push_promisenghttp2_frame_unpack_push_promise_payloadnghttp2_frame_pack_pingnghttp2_cpymemnghttp2_frame_unpack_ping_payloadnghttp2_frame_pack_goawaynghttp2_bufs_addnghttp2_frame_unpack_goaway_payloadnghttp2_frame_unpack_goaway_payload2memcpynghttp2_frame_pack_window_updatenghttp2_frame_unpack_window_update_payloadnghttp2_frame_pack_altsvcnghttp2_frame_unpack_altsvc_payloadnghttp2_frame_unpack_altsvc_payload2nghttp2_frame_pack_originnghttp2_frame_unpack_origin_payloadnghttp2_frame_pack_priority_updatenghttp2_frame_unpack_priority_update_payloadnghttp2_frame_iv_copynghttp2_nv_equalnghttp2_nv_array_delnghttp2_nv_compare_namenghttp2_nv_array_sortqsortnghttp2_nv_array_copynghttp2_downcasenghttp2_iv_checknghttp2_frame_add_padmemmovememset7-k/BC@ `& + 0DP"E@ @   D @ # (Dmy    D    0D M o  L    D Q D St P B  C0 : ? D DX   W    D   ` D0 < P e Z~    D   S ]B [   `   D `  0 D 4AMUZiZw 0  D 0  (D 0  (DQ;SRWM W@ J O TDQ2S]QW !Z/ 9 > 0CDH R W (\Dx   0DS][| p  @D p  PD `SnG]`] Lqe|r P  D[m"$;${$ $$$$tF$l (08@H D`x ,@Th|0@p00D@X`l p  4H pP@00D@p@   0  P    H  `  (<`@p` $ 8 L    .symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rodata.str1.8.rela.rodata.comment.note.GNU-stack.rela.eh_frame @@; &,12a@2xT@{ O@XL \0.ez u@HM %  0 Tnghttp2_buf.o/ 1713297051 399 399 100644 7416 ` ELF>@@ HHGHGHGHG HSHtHH3H[ATU1SLHHOL)H9r[]A\ÐHHH9HCHILHHt;HCLH;L)HCHHCL)HCHHC LH{L)HC []A\ý{듐f.HHGHGHGHG D@ATI0UHHSHHHEtMHHEHLHxH@H@H@H@ H@(u[]A\f{fHuH{f.SHHHGHHt HG1H[HG(H9G t=HWHwH|$$uHKHT$HC(HHSHK8HJHJ H[ø fHHG HGHGHHwHw HwHwH7tHHwDf.AWAVAUATIUSHHtrH9IrjL9ILŸ rGHH|$LMou0H|$L{Hk8H;H{HoHo LkHC(Ls Lc0H[]A\A]A^A_@ MIHbfIE1HRfAUIATUSHHtDHHu 2@LImHsL#HHCHHMuIEH[]A\A]Df.U HSHH(H9w8wFHWH|$ku4H߉D$ HT$D$ HK8HHSHJHJ HkHC(H([]ff.AUIATIUH0SHHHHtiMHHhHh(Hh HhHhu@HHC1LkHC8LcHC(HC HC0H[]A\A]@LHh뷸{AVIAUIATIUSHHH,RHHHHHHD$IE1H\$HD$MZMLHML@L@(L@ L@L@tML@I0IHL9HuHD$Mt$ID$8ID$Ml$(Ml$ I$ID$1Ml$0H[]A\A]A^@H11[]A\A]A^k{@HtH7HtHf.@f.HWHt(HBH9B uHHH9H t HHHuHWÐf.H1HtfDHJ H+JHHHufAVIAUIATUSHHtTImH} HEH)H9HFHIuLDt[]A\A]A^LHL)MHHE u[]A\A]1A^Ðf.SHHHGHP H9PtHJHH @21H[t$ t$ uHCHP DSHHHGHP H9Pt@21H[t$ t$ uHCHP f.SHHHWHB H9BtHHHJ @01H[t$ 't$ uHSHB DSHHHWHB H9Bt@01H[t$ t$ uHCH@ f.AUATUHSHHH}I1fHP H+PHHHuHuH[]A\A]DH}HHIt>HmHtHuHU HH)HmHuM,$HH[]A\A]1H{f.USHHHtOHH1f.HJ H+JHHHuDHsHS HH)HHuHH[]1Df.AUATUHSHLG0H?HHu8HGLHG(HHHGHG Hu!>fDHHHH(HHHHHH tHHuH}H[]A\A]HHHu =LLeHsL+LHCHLMuLE0H}LE(H}H[]A\A]1널f.f.HGHHtHPH9P D1GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx (0DX8LBAC S CBB Z ABA ,,BIG X ABC (nAG V AA E AA  !H BBB B(D0A8DPh 8A0A(B BBBE l4aBEA A(D0M(A ABB$dAIG@PAA8BED I(J0_ (A ABBE T0BEE D(A0D@ 0A(A BBBE D 0E(A BBBE "5'HuBEE A(A0s (A BBBH [(A BBD KAG _ AH 4CAG W AH XKAG _ AH |CAG W AH LBBA D(D0o (A ABBF D (D ABBA (aAAD Q DAA LBBA D(D0d (A ABBI Z (A ABBA l#n (10BSPg{, 0!`ad'>V"m5'0uKCPKC !a: M b #buf_chain_newbufs_alloc_chainnghttp2_buf_initnghttp2_buf_freenghttp2_mem_freenghttp2_buf_reservenghttp2_mem_reallocnghttp2_buf_init2nghttp2_mem_mallocnghttp2_buf_resetnghttp2_buf_wrap_initnghttp2_bufs_init3nghttp2_bufs_init2nghttp2_bufs_initnghttp2_bufs_freenghttp2_bufs_reallocnghttp2_bufs_wrap_initnghttp2_bufs_wrap_init2nghttp2_bufs_wrap_freenghttp2_bufs_seek_last_presentnghttp2_bufs_lennghttp2_bufs_addnghttp2_cpymemnghttp2_bufs_addbnghttp2_bufs_addb_holdnghttp2_bufs_orbnghttp2_bufs_orb_holdnghttp2_bufs_removenghttp2_bufs_remove_copynghttp2_bufs_resetnghttp2_bufs_advancenghttp2_bufs_next_present@  &q  B U @g    40PP 0$`p408\P  p  .symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @3 @` &s ,s 10s .: O J@ 8  |Y/0 1713297051 399 399 100644 12088 ` ELF>*@@HGHHVHH9tH)¸H9ÐHFXH9GXÐUHSHHHt!xHE`ƃHthu_HHŋHH}HHH1HHE@HCHHEPHPHUPHCXtH[]DH1[]Df.HHt tHH@f.USHHHo`tfHu_HE`HtSHHH}Ht?ƃHCHHǃHC@HǃHtH[]ù@AWEAVEAUAATAUSHHHHT$PHD$HD@DDDHD$@ƃHǃǃǃHǃƃHC`HChHCpHCxHǃHǃǃǃHC0HC8fƃHC@HCHǃHCPHCXHǃƃƃH[]A\A]A^A_ÐH@ATUSHHo`Hu uHHLeHLHHދLHH1HHE@HCHHEPHPHUPHCXHHHE`Hu[]A\ù@f.AUATUSHHDA9t!Ho`HtD)uH[]A\A]LmHLHD1DHHHI)1LHH1HHHCHI1IHDHI)HE@LCHHL)H9wHCHHHL[]A\A]OЉUSHH uJHuY1Ht H[]@H`HtHǃH[]ùSHHLJƒt [fHtH[Jf.SHHt0@ @t[DHtH[fHt-@"@t 1fDHG`HHPDf.Ht1 f1f.Ht1f.HcHcHcHƸH)ֺHH9w 1ff.HcHcHcHƸH)ֺHH9w 1ff.LJ@f.HtH9u @H9tH`Hu1fAUATIUHSHH_hHۉt]LoHk`t+HLƃHHu3f.H[xHuHu#ID$hHEhIl$h1Le`H[]A\A]@HLtHGhHtH~puHFxHppHwhH~`Pf.AVAUATUHSH_hAAH|LgfDH[xHtgOÀtLu`HLƃHLt[]A\A]A^fHE`HDHEpHHUhHHM`HPxHBpHfDHH`H@xHuHMxHu HHBxHuHJxHQpDžHE`1HEhHEpHEx[]A\A]A^HHEpHYHE`HUhHHt`HPhHB`HHM`fDHH`H@xHuHMxHu iDHHBxHuKHUxHHPxBHBp9HUxHtHBpHPhHB`H@hAUATIUHSHH_hHۉIt$hH}`toHVhHuHHBxHuHZxHSpMl$Hk`t#HLƃHHvufH[xHuHu H[]A\A]HHL[]A\A];H^hHs`@f.UHSHHHGhHtGH~puJHFxHppHuhH{`Hu H1[]HHH[]HuhH{`fSHG`HHtnHWpHtJHOxHHJxtHQp)tHLHCpHCxHC`[fHWxHHPhtHB`HBp묹ff.H`tfHhuHpu1HxHHHxHtRHHt uHH`HuHH@HHHq`H@HHHA@uHHf1HHfDtDtut@uσu1HG`Ðf.HGxÐf.HGpÐf.HGhÐf.ffnghttp2_stream.cstream->queuedstream->item == ((void *)0)stream->itemstream->dep_prevprevstream->sib_prev == ((void *)0)(stream->flags & NGHTTP2_STREAM_FLAG_DEFERRED_ALL) == 0Pnghttp2_stream_dep_remove_subtreeunlink_depnghttp2_stream_dep_removeinsert_link_depnghttp2_stream_resume_deferred_itemnghttp2_stream_defer_itemstream_obq_removenghttp2_stream_attach_itemnghttp2_stream_rescheduleGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx /00ADD  AAF DCAdAx2Dm(AAG w AAA H_BEE E(I0C8K@,8A0A(B BBB ,0BAA  ABA H`BBA A(G0q (A ABBD (G ABB4AAG f CAE _ CCA FAe J Q WAa F Q E <QxP#d#x66.8BBD D(D0 (A ABBE 3nLHBBB A(D0 (A BBBJ  (A BBBH LhBBD D(D0 (A ABBA D (G ABBE 4wADG | CAD D GAL A\ C ) $zD E ^ J FH`\p/ 04 PM2c u     `$ "  0$ "    =M[l~_  0@;VFqW@Q##61@6a.3H  w/ Q0 )l` z `@P`p3Mvstream_lessstream_obq_pushinsert_link_dep.part.2__PRETTY_FUNCTION__.5983stream_subtree_activestream_obq_remove__PRETTY_FUNCTION__.5858__PRETTY_FUNCTION__.5871__PRETTY_FUNCTION__.5908__PRETTY_FUNCTION__.5916__PRETTY_FUNCTION__.5921__PRETTY_FUNCTION__.5997__PRETTY_FUNCTION__.6012__PRETTY_FUNCTION__.6034nghttp2_pq_push__assert_failnghttp2_pq_emptynghttp2_pq_removenghttp2_stream_initnghttp2_pq_initnghttp2_stream_freenghttp2_pq_freenghttp2_stream_shutdownnghttp2_stream_reschedulenghttp2_stream_change_weightnghttp2_stream_dep_distributed_weightnghttp2_stream_attach_itemnghttp2_stream_detach_itemnghttp2_stream_defer_itemnghttp2_stream_resume_deferred_itemnghttp2_stream_check_deferred_itemnghttp2_stream_check_deferred_by_flow_controlnghttp2_stream_update_remote_initial_window_sizenghttp2_stream_update_local_initial_window_sizenghttp2_stream_promise_fulfillednghttp2_stream_dep_find_ancestornghttp2_stream_dep_insertnghttp2_stream_dep_addnghttp2_stream_dep_removenghttp2_stream_dep_insert_subtreenghttp2_stream_dep_add_subtreenghttp2_stream_dep_remove_subtreenghttp2_stream_in_dep_treenghttp2_stream_next_outbound_itemnghttp2_pq_topnghttp2_stream_get_statenghttp2_stream_get_parentnghttp2_stream_get_next_siblingnghttp2_stream_get_previous_siblingnghttp2_stream_get_first_childnghttp2_stream_get_weightnghttp2_stream_get_sum_dependency_weightnghttp2_stream_get_stream_idW    q   S_ i n  sx      ) . <3y `  <D  "  Z  0  I      I u 7%  P   40h|    04@d@@Th|@l   0 (` L `@tP`p.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rodata.str1.8.rela.text.unlikely.rodata.comment.note.GNU-stack.rela.eh_frame @@x!&,12_@2HXTO@&`c  k0.t@&x  `*/18 1713297051 399 399 100644 4184 ` ELF> @@HtHHVHGHWHf1f.HtHHVHGHWHf1f.HLJHLJƇHG`HGhHGpHGxHLJHt[G <w[$@fD`t:< tF<t*< t6HzfHGHHGHGHtHHwHGfDHwH7HGHHtHHHHǀtHoHGnghttp2_outbound_item.c0nghttp2_outbound_item_freeGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx #0#DIX~bp-:P  #80#V`Iq4Pp p&-B:__PRETTY_FUNCTION__.4735nghttp2_data_provider_wrap_v1nghttp2_data_provider_wrap_v2nghttp2_outbound_item_initnghttp2_outbound_item_freenghttp2_frame_goaway_freenghttp2_frame_window_update_freenghttp2_frame_data_freenghttp2_frame_headers_freenghttp2_frame_priority_freenghttp2_frame_rst_stream_freenghttp2_frame_settings_freenghttp2_frame_push_promise_freenghttp2_frame_ping_free__assert_failnghttp2_frame_priority_update_freenghttp2_frame_extension_freenghttp2_frame_altsvc_freenghttp2_frame_origin_freenghttp2_outbound_queue_initnghttp2_outbound_queue_pushnghttp2_outbound_queue_pop / P9 > C QYai (08@ 40H`\tp.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rela.rodata.comment.note.GNU-stack.rela.eh_frame @@ &:,:12:E`k@@ M0.Vkf@x   ] u/43 1713297051 399 399 100644 94664 ` ELF>m@@HGHHVHH9tH)1HHFXH9GXÐUSHHHH9sBL MtCHH0 HH9HFHHAHH; Hz|H9HNH[]fDL MufUSHHHt"HHwHHHH[]fH[]fUHSHHH?H3HH{HCHH[]ATUH SH<wL$fw ƒJ< < u l ELfAL@@ @1Ht Ht 1HfGtHH@ HǃHǃ LhHǃ(Hǃ0ǃH` HLL11HǃHǃHǃ[]A\LHAL@HA$?@1HfO@HfDLHLLsLcHLH8HHǃ8HǃHǃ HLLl LHL@LLLHLf.AWMAVIAUIATIUSLH(Mx HHI{HGHE11AH HCH HCH HCH HC H( I>1HD$$H H H\$I!ƀu ǀ ǀ ǀ ǀ ǀ Iƀp ǀ ǀ ǀh Iƀr IH` IMǀ$ ǀ( ǀ0 ǀ4 @ǀ8 ǀ@ ǀD ǀH ǀL ǀP ǀT @ǀX ǀ` Hǀ ǀ, dHǀ Hǀ Hǀ Hǀ tEW8AtAWHtd At AW<, At AO@H AtE_LEtd AtEOPEtd A A€t AWDl A@tEGTEtd At IWH AtIOAtAXtd At IW H AtIW(HtH A tAw\td A@tAW`td @AAt IW0H HHHAt!I6HDH([]A\A]A^A_@IHH8A:I>H '?IA  @H H @HHHHDHǐAI>HIHHILH( HIL0 I>I>t3;d `LJHLJf1@I>HDHھHHHHuH(1[]A\A]A^A_Iƀt ^IH8IHtDIWI7H` HL$EW8IHL$A%fIwdHw Hw IGlHBIGtHBIG|HBEW8IA€fDH{LJLJHǐI>LJDf.ATL UHSHHt(uH9tLHHLHHL[]1A\@ATUSHDDwYHHHH1҅u HHPHEHSHxHHuƃ[]A\fHHSHֹATUHSHHH@H@HGH||H+H1HILc1[]A\f.AWAVAAUATUSHHHL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$IH H$HL$11LD$HD$HD$ D$ 0L HD$LLcLHHH$HL$LLHD$HD$HD$ D$ 0HD$L Mt\L0 HHcHDAщHL%zH[]A\A]A^A_H 1fDH0 HHcH fDHL1뤐{fATHIUSHu ,HHLHHLHu[]A\@f.SHt3u\$w5HHHƃ[ùDUHHSHHt u H[]HHH[]/Df.USHH8tuH1[]HT$ T$ HHH[]yfUHSHHHutH[]HHH[]'t Df.ATU1St It[]A\1A;$ [@ʼn]A\ff.UHStt1; []fDH[]ATUHSDHH>EtgD?t[UuDt;u2D;e~,HuiHuFHEHt7HH]@[]1A\fEt郻ufDH]ҹ SHHH+ H; t[D1u [f.1|@t 71f.HH1Htu HEH@f.SHMI1HH|$uHT$ǂ HH[f.E11fE1뫐f.SHMIȹHH|$#uHT$ǂ HH[E11fE1뫐f.AUATUHSHHL HX Hu DHHLRHuLH1@I|H(H@uH} HHHHLHLH0LHL HDHH8HHHL[]A\A]H[]A\A]f.AWH IAVAA@AUAATIUDSHHt$(LL$HD$ Ad @HEEHMHHH HHHHǃHǃHI E1fAr -A@ A4$E1(DDDEDAD$HD$H5IP H|HHI IP u/A$"Mw A|$HL4HHH[]A\A]A^A_DHE1fAr fAr At A@ DE1Ar DDfT$(t$(LI L$(Tt$(Lx@HfDMfDHHH[]A\A]A^A_fHD$ E0 AED$t$(HHD$HD$HD$AP $fAr t$(HLHH|$ Hf15fH*H|$0DT$,Ld$0DT$,VfHI fDI tI HPI HCX DLDT$,HIDT$,HDT$,DT$,H|$0DT$,Ld$0DT$,f.IP @IH @H|$ HHAf.IH @A4$LtDT$,_H|$0DT$,A4$HL$0E11ALHIDT$,E1g(/fAUATIUHSHHt ulr tm9EHt8uuyMl$ L;k`HEHL}t=H[]A\A]Dfr uNDH[]A\A]LHIHu HHEQHLuKM>wf}uH1,@LH{`Lt uLe]HuE11AHLHI;{Of.ATUHSHHv{ w$IC $fDCu ƅv fHHƃ1H[]A\MtAƄ$M;I$uHLuA$1DS8tMpA$aH0Hƃ1\@M7ADŽ$&fDHHƃH1[]A\MA$1ɺHs(LKx1AHHH¸{HLHLfAVAUAATUHSHt  ; t uLtHH~t:H0Ht.x P9|9~HHt P9L LHIHDLLH1tLLL[]A\A]A^f.H; st /d@[]A\A]1A^DCDƀ1뎸{뇹ATIԺUSHwHu(LP MtH0 LHAкzE[]A\@ATUHSV HvAu$~ Hu.[]1A\H}[]A\H}H޺/[=|]AMA\ÐATL UHHSHuSu*HHHL[]1A\ftHH|f.Ht[]A\Df.AVAUAATAUSHHHvHx HtH0 DDHЅHLMt;HHAu&L;tL LLLLEDH=AtWEuH E1r td ut tEtWHH[]A\A]A^l@Et#H ufH E1@HtH@ Ht@HHH H@ []DA\A]A^AzA H8 UHSH(t$T$HH<$HD$~HD$Hu iHtcH؋HHǀH=|}Hu /DHHHǃHuH([]1H([]ù fD1sH@ Ht$HHH@ H fDH8 H@ H fHP Ht$HHHP H fDHH HP H fHHHtEHHt)HHdžHdžH HP HH Df.ATUHSL AH HH I9H8 HuAfDHǃH HHH tFH L9v:HtIHHHu!HH8 uHDž@ fD1[]A\ÐDh Mf.ATAdUHSh 9L FL dw ADCEL; HH Hu*iH HǃHI9H s^HHHuJHHH uH HDžP HI9H s1[]A\f<t 1ATUHSHHt H[]A\DHHu狇, H9 sH0Ht H@ ~H} HuE1HHJ|%Ht HI(I@xUSHHHHt#HƅHH[]fDHHt$HƅHH[], H9 s)H0HtH0ƅHD ~FH{ Ho1HHH<+Ht HLH(H@u@14fAWAVAUIATUSHHAHIHL 11Ef.uD`HL9tuXA9DGHL9u@tD9L8LugAt'P HHH,$Dd$D$ u:KL> w$fF` HH9u1H[]A\A]A^A_fDF\ DFX DFT DFH DFD DFP DFL rfL8DL\ATUHSHLfvu;I|$uNHP HtH0 HHЅuQ[]1A\I|$uHt߃tI|$tHH HtH0 HHЅt[]zA\@HH 1HtHH0 уH%zATIUSvHHHtHt?d uAD$ ulHH HtH0 LHЉ¸zu AD$ u1[]A\H<uHHJ=||ÐHtH=||H덐f.u t1@f.ATUSu HuHt[]A\@[]1A\ÐHuHuH(tBLH1I<,t,H(H@uH0t, H9 댃 z@f.Su HutH[@t1[1t u x u tÐHHf.HSHt'ru[ED[Ð[fATIUSHucHtyt,Lt tQE[]A\t-1҃[R]A\[]A\1뺺볹@AUATL UHSHHHP t^u>Ht.HHHH[]A\A]fHǃDHHL[]A\A]Kxyup@zHHItMtLHdfAWIAVAAUL ATAUSHHAtH H9 LHHHALHHHu&1EtH H[]A\A]A^A_HD$ HLD$ H[]A\A]A^A_fDxf{fAWL AVAUAATMUHSHHT$DL$ t=¸ MIT$ H@LLHILHHLHHH T$MLHA9AND$ HH߈E`u*u 1H[]A\A]A^A_f.E1LHD$HLD$H[]A\A]A^A_{LL{Df.AUAATAUHSHHHLJt;HIAHDDHuu H[]A\A]E1ːf.u  t 1fD1ɉmf.u t1@1Ifu  t 1fDHщff.ATIUSHP HHt H0 ЅuKv1u  t[]A\DHL[]A\zfATUHSDfHEt Du-tHH?=|}h[]A\ktwL H D H9su u0u9uth H9rXHH=||[]A\fDgfDDHDHME11AHHH=|% H Ht*H0 HHЉ¸9fz1DHH0#{f.ATUSHIvHt|uIH ǃHt+H0 LHЉ¸9tfzt []A\@[]1A\ÐLH;[¸|]LA\ùf.USHBHvHt L H H9u h H9HHT$HT$HH H HH0 HHЉ¸9tfztnfDH[]ÐHH =||H[]H=|}H[]Df1@H CfUHSHHvt}HT$HT$u.H Ht/H0 HHЉ¸9tfzt H[]fDH1[]HH=||H[]ÃuDff.UHSHHHPHHHHtdtǃHH[H]@tHHT$QHT$tǃHH[H]=DǃHH[H]DǃHH[H]Mf.AUATIUHSH^t @H 2u ^El$(HDHùD At$HHp H H9 1ɺHAt$(E11AHHH H HtKH0 LH=zE%LHC=|}*H[]A\A]DAt$(HuH[]A\A]fD랹뗉묻{Df.ATIUSnHuod t6HH HtH0 LHЅzE[]A\f.F uuIT$Ht[]A\=f.ATUHSFHu_DfE~ D)tED; H=2H9iH?]H|$HGHH HGD$T$<D*cHH[]A\A]A^A_IHq L\$(HL$ HHT$HT$HL$ L\$(ucI99IFHHpHPH+P Ht$DAEAE|K sH H&ISI+S A$ƒHMHLHLLIl$HLLFzfDL_RI8Df.AWIAVAAUATUSH8Ht$=|IIM HD$HL$IAHL$ DtB5uIHBH;B ~ H|$L赪AuIHBH;B P EuL LA{}zALJILsHIpIILM0 HH+NLFhHPA =~u=juvL.K LBAfDLHH@ < x$f=tfHzH8[]A\A]A^A_f.L]  H|$H=fDH|$H3Á}/III} bI` Ht"I0 HL=,ALJ@E tI Hz HI Au H|$H^LH|$H5fDE t+I H HLI YH|$HDL*H|$HfDuLAt IHLfM A(  AM Au  H\$ HU HuHI; H|$HHHLFA E(Q9 A DuLHIH;z HL&A Ic4 @HcH=@HOH9HOIcH9HNиHHHH LAtAH|$ILJL92 }8 uLMxHME11LHH0Au LFAd BHU0Hu(H|$ HI; HT$ H|$H(HLvu8*EA9 * f.Mp MtI0 HLAЅJE <6<u(L=|HH8[]A\A]A^A_LLD$(谱uL=|ËL$(BDE Mp Mt0w"<t~I0 HLAЅE <y<uTu(tHLLHAHLH|$L誣A|}4Ic0fLHHLH|$Lm|HcDLL荰sL=|`H}`< Q<< g DEA fuLHIHLAt tAL踰E8LL6LI HxM@M0 LIq MiLL$(I)I@LGHLH=LL$(I9\HH?MHEIQI;Q HzHHIA IyL@H81[]A\A]A^A_ËU8ushHL$HHJ HH+BHJLHL7upAE8LLMdA'AtLˮ`uLHLHL蚭<LL]urH|$HLL转E8r1LXe9 DI HxDE8uHt$LE`MHL===7LLD$(aL$( HEL@LHtTH|$HLmH|$H=| =|t @HHLH%At AAu u*HExE8H3I'zp{7z\LHHLHz)   1LQf@ LA)2 USHHHHH~Ht HHF1HHxHH9uDIALD$\HD$8HnI;I@ADžHD$ 1HD$ I`1HHD;GHHQIHDDGH\$0H1IDž8IDžIDžHL=|HlI@I` AIDžADž 0I HD$M0 LH$H$Ht$0== b H$H$LEAHrLHHt$HRT$H@H$1=|n.@IPH$$NeH੿RIM8Ht,1A;0LI@uHH;pHH9uHAIH$Iȃ$IHL苹=|ADADž8A7HD$8D$\l$\t$\d$\H\$0IPHHL=|^A=AxADžII8HHIH$H II@1I`ADžWL裦=|A`H^I< << fAAl 3At IAƅIHI@ADžI`DI HjI0 Ht$0LЅQJHIADžI@HADžtI; HBItH|$PH4HI8FII@1HD@I`)1Lv=|Au A KAu A ,Au A ~L薤=|aH_H|$PHHI_IhHHI HRH$I0 LH$LILAHJHRHt$$4$Ht$0LHI\gL݃A$uAnAIt/HAu A ?ADž 1ADž HIPIH9HQAu A XfHy1HwHpHQIH9dHII@ADžI`QI@I`ADž 1HcLt$HHI)LL)H|$PHpHIIIhHH$H$LEAHrLHHt$HRT$H@H$1~=|+HD$8HT$0L6=|[Al 9At IAƅIHfAr H I@ADžI`Al At IIAAHAƅADž@L1H$H9HK/fDH4HHIH9 HIEH9WI@ADžI`H7ALH5Ht$0H ADAHT$0LF=|AAHD1uq@At )'I$ID;PPI@LE1;.HzHcLHu@K[AHt$0H?D H{Au A  L՝=|HH|$PHHItIIhH0 VHL|<=|{Au A y{f.UHSH@@H@ 1L0 @HHHHH~BH@HHHHxJH9t@HH?t-Ht$HzEH@[]fDHtOHtJHzDH@[]@8 HCf.zf1ff.d t"HY1=|LHf.ATUSt@d Ht%I1HtLHH:=|L؉[]A\ ~*9 w"t u@t 1@@t ff. f fu HG f.HG Ðf.t ATUSHHr t\th92HtaHItTHEHH$ED$HLH1=|LH[]A\f.H1[]A\ fATUHSHr t|tf92It_JztVHHuGI$HH$AD$D$E1H1҉HAHH[]%{A\fH []A\fH1[]A\DH8@H@H0 USHH(t HHD$tn1r t H([]@t\L$ HHtK|$L$ vD$t H|$HHxH([]fD떐 fUSHt tI1ۀr tH[]Dt4HHt%HH[]D뻐  nghttp2_session_upgrade2nghttp2_session_upgradenghttp2_session_get_local_settingsnghttp2_session_get_remote_settingsnghttp2_session_set_stream_user_datasession_sched_reschedule_streamnghttp2_session_pack_datanghttp2_session_add_settingsnghttp2_session_recvsession_process_settings_framesession_end_stream_headers_receivedsession_after_header_block_receivednghttp2_session_mem_recv2nghttp2_session_on_priority_update_receivednghttp2_session_on_priority_receivednghttp2_session_on_push_response_headers_receivednghttp2_session_on_response_headers_receivedfind_stream_on_goaway_funcsession_close_stream_on_goawaysession_after_frame_sent1session_pack_extensionsession_predicate_push_promise_sendsession_predicate_headers_sendsession_predicate_response_headers_sendnghttp2_session_predicate_data_sendsession_prep_framenghttp2_session_mem_send_internalnghttp2_session_mem_send2nghttp2_session_adjust_idle_streamnghttp2_session_adjust_closed_streamsession_ob_data_removenghttp2_session_open_streamnghttp2_session_add_rst_streamsession_ob_data_pushnghttp2_session_reprioritize_streamPRI * HTTP/2.0 SM nghttp2_session.cstream->queued == 0urgency < (7 + 1)stream->queued == 1dep_streamrv == 0head_streamheadstreamHEADERS: stream closedHEADERS: stream_id == 0PUSH_PROMISE: stream_id == 0PUSH_PROMISE: push disabledPUSH_PROMISE: stream in idlePUSH_PROMISE: stream closedPING: stream_id != 0GOAWAY: stream_id != 0WINDOW_UPDATE to idle streamsession->serverPRIORITY: stream_id == 0depend on itselfRST_STREAM: stream_id == 0RST_STREAM: stream in idle0nghttp2_is_fatal(rv)SETTINGS: stream_id != 0SETTINGS: unexpected ACKbufs->head == bufs->cur0 == rvstream->item == itembuf->pos == buf->lastDATA: stream_id == 0DATA: stream in idleDATA: stream closedDATA: stream not openedDATA: stream in reservedinlen == 0SETTINGS expectedtoo large frame sizeCONTINUATION: unexpectedHEADERS: invalid paddingPUSH_PROMISE: invalid padding!session->serveri < iframe->nivDATA: invalid paddingproclen == readlenstream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIESstream->closed_next == ((void *)0)stream->closed_prev == ((void *)0)stream->state == NGHTTP2_STREAM_IDLE(stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES) || nghttp2_stream_in_dep_tree(stream)!(stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES)(!session->server && session->pending_no_rfc7540_priorities != 1) || (session->server && !session_no_rfc7540_pri_no_fallback(session))pri_spec->stream_id != stream->stream_idheaders_frame->hd.type == NGHTTP2_HEADERSrequest HEADERS: stream_id == 0request HEADERS: client received requestrequest HEADERS: invalid stream_idrequest HEADERS: max concurrent streams exceededrequest HEADERS: depend on itselfstream->state == NGHTTP2_STREAM_OPENING && nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)stream->state == NGHTTP2_STREAM_RESERVEDpush response HEADERS: stream_id == 0HEADERS: no HEADERS allowed from client in reserved statepush response HEADERS: max concurrent streams exceededPUSH_PROMISE: invalid stream_idPUSH_PROMISE: invalid promised_stream_idGOAWAY: invalid last_stream_idWINDOW_UPDATE: window_size_increment == 0WINDOW_UPADATE to reserved streamPRIORITY_UPDATE: stream_id == 0PRIORITY_UPDATE: prioritizing idle push is not allowedPRIORITY_UPDATE: max concurrent streams exceeded!session_no_rfc7540_pri_no_fallback(session)SETTINGS: ACK and payload != 0SETTINGS: invalid SETTINGS_ENBLE_PUSHSETTINGS: server attempted to enable pushSETTINGS: too large SETTINGS_INITIAL_WINDOW_SIZESETTINGS: invalid SETTINGS_MAX_FRAME_SIZESETTINGS: invalid SETTINGS_ENABLE_CONNECT_PROTOCOLSETTINGS: server attempted to disable SETTINGS_ENABLE_CONNECT_PROTOCOLSETTINGS: invalid SETTINGS_NO_RFC7540_PRIORITIESSETTINGS: SETTINGS_NO_RFC7540_PRIORITIES cannot be changed&session->aob.framebufs == bufs((size_t)((buf)->end - (buf)->last)) >= datamaxsession->remote_window_size > 0session->last_sent_stream_id < frame->hd.stream_idsession->obq_flood_counter_ > 0session->last_sent_stream_id + 2 <= frame->push_promise.promised_stream_idsession->callbacks.pack_extension_callback2 || session->callbacks.pack_extension_callbackframe->hd.type == NGHTTP2_HEADERSDATA: stream in half-closed(remote)Remote peer returned unexpected data while we expected SETTINGS frame. Perhaps, peer does not support HTTP/2 properly.DATA: insufficient padding spaceHEADERS: insufficient padding spaceSETTINGS: too many setting entriesPUSH_PROMISE: insufficient padding spacePRIORITY_UPDATE is received from serverIgnoring received invalid HTTP header field: frame type: %u, stream: %d, name: [%.*s], value: [%.*s]Invalid HTTP header field was received: frame type: %u, stream: %d, name: [%.*s], value: [%.*s]iframe->state == NGHTTP2_IB_IGN_ALL((size_t)((&iframe->lbuf)->end - (&iframe->lbuf)->last)) > 0unexpected non-CONTINUATION frame or stream_id is invalidGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx /(0nAAG N AAG 0\7AAG X GAG DAA$=ADG nAA,BAH Q ABA dBEE E(D0C8G`z 8A0A(B BBBE + 8C0A(B BBBA (P\BHD HAD,|BAA v ABC (VBAD KABLBBE B(A0A8JC 8A0A(B BBBD ((BBGA tABTA~ A 0pAAGG [ AAD DGA0WAAG0[ CAH `AA0IADM \ AAH DGA 4 4BAE Q CBA KGB(X=AFV AJ PD,BAD j ADJ 6Aa F J ,Dg(6AO dAH\p9AR dAHBBA D(D0 (G ABBH D(A ABBdwBLI E(D0D8D 8A0A(B BBBF  8D0A(B BBBJ LlBBD D(G@i (A ABBF q (A ABBA @BAD G0N  AABH   CABH LBBE A(D0 (A BBBK q (A BBDF (P\BIC JAB@|BAD l ADH P ABM RFF4BHG w ADC mABLBBE D(A0 (A BBBI v (A EBBH 4HADD@ AAH F AAA  GGa,BAD  ABB (BGD AB,(@BAD P ABF 4lAAG f AAG c DAH HBBB E(A0A8DP 8A0A(B BBBG 4BAD { ADI CAG( -RR,@ BDA ^ ABH p 4 BAA \ ABE A ADB  =Aj E L 6dN$ 7D[ I F B FD BDA @ ADD T HDH A CDH Hd BBH H(G0| (A ABBC T (G ABBH ` BEE I(D0A8GPl 8A0A(B BBBI _ 8A0A(B BBBG ` QBIB E(D0D8GP 8A0A(B BBBK j 8A0A(B BBBD 8x eBED D(G0@ (A ABBD  #  $4 wBDC ~ ABF W ABF 8( BAD B ABD a AGG Dd BAA l ABE A ADB V NEA @ nAAD0 AAB ` FAI X AAF @ ADG0k AAG D CAH ` FAA H4 AHG0G DDI n DDJ N DDJ NDDL BBD D(D@z (C ABBF \ (H ABBG 4 BDA y CBK qAB@BFD X AGD Q ABL IABPLBDD  ABB f GBI B ABC q LBQ XBBB A(A0GPv 0D(A BBBH  0D(A EBBA PIBAA O ABJ P ABU A NBG A AGG lP/BGA D(G0X (G ABED I (G ABBK \ (D ABBK D(D ABBHBJE E(H0G8D@S 8A0A(B BBBJ H BJD A(G@^ (A ABBD D(I ABBX2D mp9G q<ADG j AAH N AAP DFA4ADG i DAN d AAB $Ak L ] K jP(BAA G0B  AABG v  AABF   AABG ||BLB E(D0D8F` 8D0A(B BBBD J 8A0A(B BBBD  8C0A(B BBBA HKBGE B(D0A8D` 8D0A(B BBBG XHBEI D(F0G 0C(A BBBB  0A(C BBBG L1BBE B(A0A8De 8A0A(B BBBH |)BEE B(A0A8Dp 8A0A(B BBBK  8A0A(B BBBA  8C0A(B BBBA 4tuAFG n DAG K DDA 0AAG0 CAF FCA$DU G DBDD V ABE \ ABI A AGA 0XVADD w ACD DFC.Db A  DT A 0Dd A  0.Db A L@`Df F J F J F J F J F J F J F J F @Df F J F J F J F J F J F J F J F 4^ADD O CAD ` CAA 4 aBGD N ABB d ABA X&DZ A t$DX A HBBD A(D0m (C ABBF l (C ABBD H&BBE E(A0A8G{ 8A0A(B BBBA (8<ADG AAG i AAE x3RS(OBCA { ABD 4  @4BAA G0T  CABK D  CADD LxBAD D0i  AAGC D  FABC D CAB  4AAG@` AAE O AAG 4<gAAD X CAF f CAF / 0n)7?=Z v \P P 0 V P B  20AMWlI0P4= %6G ` $y0 \t@!! L %e #~PA*= +7`+$,0 /eR0wt`- 2`5,%0@@2;A9_0CypO` U) 9R "kP( $P  %$#3`L Vpo@$$   ->Xy " < Y s        " 2 J b v           9 ] n    ,  @ P6 ! = 9Y t       0w $ > X p     %De` 'EvP!G'0"GH"ak"#$$ %A\& ((-(0)J)e*6,-Q/#;/^/$0@23n84\P6@889P;D`x=I`>/?(IkBBG5Fbx KKPQ11Mbr5Nndu7@ePPeef$0ffVPgpg.Lg g0gh h 50h.c`hph0ii^Pjaj&)j$Q kik&4at3W{ D e  0 @ `3 O 4!0;!@c!P!p!!!" 5" g""Е "" #9#gd#stream_lesssession_call_select_paddinginflight_settings_delactive_outbound_item_resetsession_inbound_frame_resetsession_newfree_streamssession_ob_data_push__PRETTY_FUNCTION__.6736session_headers_add_padsession_call_error_callbackob_q_free.isra.9session_ob_data_remove__PRETTY_FUNCTION__.6742session_detach_stream_itemsession_update_stream_prioritysession_resume_deferred_stream_itemnghttp2_session_is_my_stream_id.part.19session_is_new_peer_stream_idsession_detect_idle_streamfind_stream_on_goaway_func__PRETTY_FUNCTION__.7076nghttp2_session_want_read.part.30__PRETTY_FUNCTION__.6845__PRETTY_FUNCTION__.6723__PRETTY_FUNCTION__.6825session_handle_invalid_stream2CSWTCH.92update_remote_initial_window_size_funcsession_close_stream_on_goaway__PRETTY_FUNCTION__.7086nghttp2_session_close_stream_if_shut_rdwr.part.29__PRETTY_FUNCTION__.6887__PRETTY_FUNCTION__.6898update_local_initial_window_size_funcsession_is_closingsession_predicate_for_stream_sendnghttp2_session_predicate_data_send__PRETTY_FUNCTION__.6986session_after_frame_sent2session_terminate_session.part.34session_handle_invalid_connection__PRETTY_FUNCTION__.7364__PRETTY_FUNCTION__.7371session_process_headers_frame__PRETTY_FUNCTION__.7569__PRETTY_FUNCTION__.7390session_update_consumed_sizesession_update_connection_consumed_sizesession_update_stream_consumed_sizesession_after_frame_sent1__PRETTY_FUNCTION__.7122__PRETTY_FUNCTION__.7871nghttp2_session_upgrade_internal__PRETTY_FUNCTION__.7895__PRETTY_FUNCTION__.6790nghttp2_session_mem_send_internal__PRETTY_FUNCTION__.7029__PRETTY_FUNCTION__.7018__PRETTY_FUNCTION__.7183__PRETTY_FUNCTION__.6943__PRETTY_FUNCTION__.6928__PRETTY_FUNCTION__.6952__PRETTY_FUNCTION__.7202__PRETTY_FUNCTION__.7913__PRETTY_FUNCTION__.7972__PRETTY_FUNCTION__.7985__PRETTY_FUNCTION__.8007__PRETTY_FUNCTION__.8017static_in__PRETTY_FUNCTION__.7722__PRETTY_FUNCTION__.7497__PRETTY_FUNCTION__.7343__PRETTY_FUNCTION__.7335__PRETTY_FUNCTION__.7800.LC0nghttp2_mem_freenghttp2_outbound_item_freenghttp2_bufs_resetnghttp2_buf_wrap_initnghttp2_buf_freenghttp2_frame_goaway_freenghttp2_frame_window_update_freenghttp2_frame_headers_freenghttp2_frame_priority_freenghttp2_frame_rst_stream_freenghttp2_frame_settings_freenghttp2_frame_push_promise_freenghttp2_frame_ping_freenghttp2_frame_altsvc_freenghttp2_frame_extension_freenghttp2_frame_origin_freenghttp2_mem_callocnghttp2_stream_initnghttp2_ratelim_initnghttp2_hd_deflate_init2nghttp2_hd_inflate_initnghttp2_bufs_init3nghttp2_map_initnghttp2_enable_strict_prefacenghttp2_pq_initnghttp2_hd_inflate_freenghttp2_hd_deflate_freenghttp2_mem_defaultnghttp2_bufs_addnghttp2_stream_freenghttp2_pq_emptynghttp2_pq_topnghttp2_pq_push__assert_failnghttp2_frame_add_padvsnprintfnghttp2_mem_mallocnghttp2_pq_removenghttp2_stream_detach_itemnghttp2_stream_resume_deferred_itemnghttp2_map_sizenghttp2_is_fatalnghttp2_session_is_my_stream_idnghttp2_session_get_streamnghttp2_map_findnghttp2_session_get_stream_rawnghttp2_session_client_new3nghttp2_session_client_newnghttp2_session_client_new2nghttp2_session_server_new3nghttp2_session_server_newnghttp2_session_server_new2nghttp2_session_delnghttp2_pq_freenghttp2_map_each_freenghttp2_map_freenghttp2_bufs_freenghttp2_session_open_streamnghttp2_stream_in_dep_treenghttp2_stream_dep_insertnghttp2_stream_dep_removenghttp2_stream_shutdownnghttp2_stream_dep_addnghttp2_map_insertnghttp2_priority_spec_default_initnghttp2_session_reprioritize_streamnghttp2_stream_dep_remove_subtreenghttp2_stream_dep_insert_subtreenghttp2_stream_dep_add_subtreenghttp2_stream_dep_find_ancestornghttp2_stream_change_weightnghttp2_session_add_itemnghttp2_outbound_queue_pushnghttp2_stream_attach_itemnghttp2_priority_spec_initnghttp2_session_add_rst_streamnghttp2_outbound_item_initnghttp2_frame_rst_stream_initnghttp2_stream_update_remote_initial_window_sizenghttp2_stream_check_deferred_by_flow_controlnghttp2_session_destroy_streamnghttp2_map_removenghttp2_session_close_streamnghttp2_map_eachnghttp2_session_keep_closed_streamnghttp2_session_keep_idle_streamnghttp2_session_detach_idle_streamnghttp2_session_adjust_closed_streamnghttp2_session_adjust_idle_streamnghttp2_session_close_stream_if_shut_rdwrnghttp2_session_get_next_ob_itemnghttp2_stream_next_outbound_itemnghttp2_session_pop_next_ob_itemnghttp2_outbound_queue_popnghttp2_session_update_local_settingsnghttp2_hd_inflate_change_table_sizenghttp2_session_on_altsvc_receivednghttp2_session_on_origin_receivednghttp2_session_on_data_receivednghttp2_http_on_remote_end_streamnghttp2_session_want_readnghttp2_session_want_writenghttp2_session_check_request_allowednghttp2_bufs_next_presentnghttp2_session_add_pingnghttp2_frame_ping_initnghttp2_session_add_goawaymemcpynghttp2_frame_goaway_initstrlennghttp2_session_terminate_sessionnghttp2_session_terminate_session2nghttp2_session_terminate_session_with_reasonnghttp2_session_on_request_headers_receivednghttp2_session_on_response_headers_receivednghttp2_session_on_push_response_headers_receivednghttp2_stream_promise_fulfillednghttp2_session_on_headers_receivednghttp2_frame_unpack_headers_payloadnghttp2_session_on_push_promise_receivednghttp2_session_on_ping_receivednghttp2_session_on_goaway_receivednghttp2_session_on_window_update_receivednghttp2_session_on_priority_update_receivednghttp2_http_parse_prioritynghttp2_extpri_to_uint8nghttp2_session_on_priority_receivednghttp2_session_on_rst_stream_receivednghttp2_time_now_secnghttp2_ratelim_updatenghttp2_ratelim_drainnghttp2_session_add_window_updatenghttp2_frame_window_update_initnghttp2_should_send_window_updatenghttp2_stream_update_local_initial_window_sizenghttp2_session_update_recv_stream_window_sizenghttp2_session_update_recv_connection_window_sizenghttp2_submit_data_sharednghttp2_session_add_settingsnghttp2_iv_checknghttp2_frame_settings_initnghttp2_frame_iv_copynghttp2_session_on_settings_receivednghttp2_hd_deflate_change_table_sizenghttp2_frame_unpack_settings_payload2nghttp2_frame_hd_initnghttp2_submit_settingsnghttp2_session_pack_datanghttp2_frame_pack_frame_hdnghttp2_bufs_reallocnghttp2_pq_sizenghttp2_stream_reschedulenghttp2_frame_pack_window_updatenghttp2_frame_pack_goawaynghttp2_frame_pack_pingnghttp2_frame_pack_prioritynghttp2_frame_pack_settingsnghttp2_frame_pack_rst_streamnghttp2_hd_deflate_boundnghttp2_frame_pack_push_promisenghttp2_stream_defer_itemnghttp2_frame_pack_headersnghttp2_frame_pack_altsvcnghttp2_frame_pack_priority_updatenghttp2_frame_pack_originnghttp2_http_record_request_methodnghttp2_session_mem_send2nghttp2_session_mem_sendnghttp2_session_sendnghttp2_session_get_stream_user_datanghttp2_session_set_stream_user_datanghttp2_session_resume_datanghttp2_stream_check_deferred_itemnghttp2_session_get_outbound_queue_sizenghttp2_session_get_stream_effective_recv_data_lengthnghttp2_session_get_stream_effective_local_window_sizenghttp2_session_get_stream_local_window_sizenghttp2_session_get_effective_recv_data_lengthnghttp2_session_get_effective_local_window_sizenghttp2_session_get_local_window_sizenghttp2_session_get_stream_remote_window_sizenghttp2_session_get_remote_window_sizenghttp2_session_get_remote_settingsnghttp2_session_get_local_settingsnghttp2_session_upgradenghttp2_session_upgrade2nghttp2_session_get_stream_local_closenghttp2_session_get_stream_remote_closenghttp2_session_consumenghttp2_session_mem_recv2nghttp2_http_on_request_headersnghttp2_cpymemnghttp2_frame_unpack_frame_hdnghttp2_buf_resetnghttp2_frame_trail_padlenmemcmpnghttp2_hd_inflate_hd_nvnghttp2_http_on_headernghttp2_frame_unpack_priority_update_payloadnghttp2_get_uint16nghttp2_frame_unpack_window_update_payloadnghttp2_frame_unpack_ping_payloadnghttp2_frame_unpack_rst_stream_payloadnghttp2_frame_unpack_priority_payloadnghttp2_frame_unpack_origin_payloadnghttp2_frame_unpack_altsvc_payloadnghttp2_frame_unpack_goaway_payloadnghttp2_hd_inflate_end_headersnghttp2_http_on_data_chunknghttp2_frame_priority_lennghttp2_frame_unpack_settings_payloadnghttp2_frame_unpack_settings_entrynghttp2_frame_unpack_push_promise_payloadnghttp2_http_on_response_headersnghttp2_http_on_trailer_headersnghttp2_session_mem_recvnghttp2_session_recvnghttp2_session_consume_connectionnghttp2_session_consume_streamnghttp2_session_set_next_stream_idnghttp2_session_get_next_stream_idnghttp2_session_get_last_proc_stream_idnghttp2_session_find_streamnghttp2_session_get_root_streamnghttp2_session_check_server_sessionnghttp2_session_change_stream_prioritynghttp2_priority_spec_normalize_weightnghttp2_session_create_idle_streamnghttp2_session_get_hd_inflate_dynamic_table_sizenghttp2_hd_inflate_get_dynamic_table_sizenghttp2_session_get_hd_deflate_dynamic_table_sizenghttp2_hd_deflate_get_dynamic_table_sizenghttp2_session_set_user_datanghttp2_session_change_extpri_stream_prioritynghttp2_session_get_extpri_stream_prioritynghttp2_extpri_from_uint8VWV XC 7YJZVY[\]^$_7`FVwabcde&fg1hli~VjklRm nop h q  r# W. V6 sA V t u v P  ? w P   + w P   $ ww x= yV z y V7 Vy W V {   w     ?w   " Q'w@|}o y ~ hw   @w~j|s  pog    ewXgvsV    w Ywz4Pv    w    w $C  M R `Wwat    ew7Pk  u z w H0zI|qz!,<_GV 0   w QjsV4bWV ! '!i!! ! ! p!w##  # # x#w`$$  $ $ $w?%X%u%% &/&J&u '$' PA9'Z' (y((i))))9*tO*t*+ + , ,wJ,,-z(-7-B-x-b-V).zC.P.zd....[.V/VI/c/c0 0 h0 1 Q1 Ht1 1122 2 2 `2 2 2w<3 33 A4 (f4  p4 u4 z4w5 I5 {556 6 6+7 K7f77 78  8 `88 18 FQ9 9 ]9:i: : x; (;#</<Y< H< <<< < < z=w= = ===->A> K> P> U>wc> >>>  ?J?U?b??z????\@V@@cAAAqBBCCC CD]DD9EQEdEwEE E E EwEIFYFFFGlGGzGGG H`HV7HHzHHzI1I?0@\@tAPABB,0CG KLpOPQUxd@ePef0f\fPgpgggg h  h40hP`hdph0ii$Pj\jxj kk,0@@|`0@Pp$8| Е@.symtab.strtab.shstrtab.rela.text.data.bss.rela.rodata.rodata.str1.1.rodata.str1.8.comment.note.GNU-stack.rela.eh_frame @@( 0H &8,<6@ 1@XU >2M2: \0ڱ.ezpu@`` x0V ~#@m/62 1713297051 399 399 100644 15448 ` ELF>8@@AWMAVAUMATIUSH HHHɉt$T$H$qHLt$0LHD$0AD$8H|$(HLLHD$(HHD$HI/HHtH}tHEIG`HEIGhHEIGpt$H$IGx!|$tELL$T$@MLL,$LLAuZ1HH[]A\A]A^A_ÐA$ xdELL$1@MA$ LL,$LLAĉEtHLLHHHD[]A\A]A^A_AH|$HLt$0LfDA{~Zt tAHMIt-1Ix@L$HD$I1ɉH@אf. f.AWAVAUATIUSHt HHIILMt HtR1HtkH}@ƉL|$H,$ HMEMH@LDH[]A\A]A^A_DA$@ tA9$ u fff~4HIIHD$H$1ɾHfD fAUATIUSHH(AAHt"HLL$LD$LD$LL$t11HD$PAH$HىLHD$HCIIHIFHSHsI9HxuL)H9|$H|$HH}HHC@HLHC`HCHL1tL|$HLHLH([]A\A]A^A_fDE1v ܸL{Ƹ{뿹xf.AWAVAUATUHSHt @ 1AI@MH=@ML E1LHHHHC@LLDHC`HCHH1tLHHLH[]A\A]A^A_fIpLHL$HIt.HL$LHHK@ 멐롸{L{AUIATIUHLSHH8H|$LL$LL$LLHHIH8[]A\A]@AUIATIUHLSHH8H|$LL$LL$LLHHIH8[]A\A]@AUIATIULSHH(HLLHIH([]A\A]fAUIATIULSHH(HLLHIH([]A\A]fAW AAVAAAUL ATIUSHtuLHHHtmHHE1DHHC`HEHChHECyDsxHCpHL1tHHLH[]A\A]A^A_Ð{fATUSH Ht.HAHH@DHHH []A\ùff.ATUSH Ht.HAHH@DHHH []A\ùff.AUIHATIHUHSHHtCH[HL9wHHH[]A\LA]HH[]A\A]fDH Df.{f.AWAVAUIATL USH@ L$ H AMtxLHHHL$ @AMHHL1tHHLH[]A\A]A^A_fH z ɐ{nghttp2_submit.cpri_specdata_prdP0(size_t)(p - (uint8_t *)ov_copy) == nov * sizeof(nghttp2_origin_entry) + len + novnghttp2_submit_data2nghttp2_submit_datanghttp2_submit_origindetect_self_dependencyGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx dBEB E(D0A8K 8A0A(B BBBB b 8D0A(B BBBA fS p E HAHBBB B(D0A8DPo 8A0A(B BBBF >H i8BBD C(GPf (A ABBB X\lBBA D(D@ (A ABBE W (C ABBA D (C ABBD (FxjBBB I(D0A8G` 8A0A(B BBBD Z 8C0A(B BBBB W 8A0A(B BBBG L BAA D0  AABD X  AABD D CAB`6JAC G@W  AABH k  AABI Y  AABC `HLBIB B(D0A8D` 8A0A(B BBBG HBIB E(A0A8D`7 8A0A(B BBBG H=BBB B(A0D8DP 8A0A(B BBBJ 40LBED G(G`l(A ABB4hLBED G(G`l(A ABB4>BED F(GP_(A ABB4>BED F(GP_(A ABBHBJI I(D0A8D@} 8A0A(B BBBB 0\TBAA D@n  AABA 0TBAA D@n  AABA HqBHG D(G0Y (G ABEL K (A ABBG L$BBB E(H0C8DP 8A0A(B BBBJ f2W `p@ @      !<Wp>P4 Ha0y @(pF:Roj@ #DfP6 '6Pj0  = L0NpLf>>@T`T)qHY}@Psubmit_headers_shared_nvasubmit_response_shareddetect_self_dependency.isra.0.part.1__PRETTY_FUNCTION__.5334submit_request_shared__PRETTY_FUNCTION__.5494__PRETTY_FUNCTION__.5591__PRETTY_FUNCTION__.5599nghttp2_priority_spec_normalize_weightnghttp2_nv_array_copynghttp2_mem_mallocnghttp2_outbound_item_initnghttp2_frame_headers_initnghttp2_session_add_itemnghttp2_frame_headers_freenghttp2_mem_freenghttp2_nv_array_delnghttp2_priority_spec_default_init__assert_failnghttp2_priority_spec_check_defaultnghttp2_submit_trailernghttp2_submit_headersnghttp2_submit_pingnghttp2_session_add_pingnghttp2_submit_prioritynghttp2_frame_priority_initnghttp2_frame_priority_freenghttp2_submit_rst_streamnghttp2_session_add_rst_streamnghttp2_submit_goawaynghttp2_session_add_goawaynghttp2_submit_shutdown_noticenghttp2_submit_settingsnghttp2_session_add_settingsnghttp2_submit_push_promisenghttp2_session_is_my_stream_idnghttp2_frame_push_promise_initnghttp2_frame_push_promise_freenghttp2_submit_window_updatenghttp2_session_get_streamnghttp2_adjust_local_window_sizenghttp2_session_add_window_updatenghttp2_session_set_local_window_sizenghttp2_increase_local_window_sizenghttp2_session_update_recv_connection_window_sizenghttp2_session_update_recv_stream_window_sizenghttp2_submit_altsvcnghttp2_cpymemnghttp2_frame_altsvc_initnghttp2_frame_altsvc_freenghttp2_submit_originnghttp2_frame_origin_initnghttp2_frame_origin_freenghttp2_submit_priority_updatenghttp2_frame_priority_update_initnghttp2_frame_priority_update_freenghttp2_submit_requestnghttp2_data_provider_wrap_v1nghttp2_submit_request2nghttp2_data_provider_wrap_v2nghttp2_submit_responsenghttp2_submit_response2nghttp2_submit_data_sharednghttp2_frame_data_initnghttp2_frame_data_freenghttp2_submit_datanghttp2_submit_data2nghttp2_pack_settings_payload2nghttp2_iv_checknghttp2_frame_pack_settings_payloadnghttp2_pack_settings_payloadnghttp2_submit_extensionnghttp2_frame_extension_initnghttp2_frame_extension_freeObOZozv$%.1E^/0d234304642 65 4F 7Q 3n 8  :I ]  ;  <   : =  : - G ?R j @u  = @  H \ y B  C   :=DEGEGwKLE.J< F K P|GJ   PTU$")'d)),Q `   @ P\ p0 @p  @PP 0  4 lp@``@(P.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rela.text.unlikely.rodata.str1.8.rodata.comment.note.GNU-stack.rela.eh_frame @'@*h &g,g12g#E@@4`T2Scwk0w.tp@4  ("7/80 1713297051 399 399 100644 12168 ` ELF>+@@ff7Ή7Ðf.fÐf.HH7tHGH9u~RDE1EDIA)xD1fDEDE9lE)D:9O)lj:xE)1fDADx@AA)D9|29)D)1D‰f.f.x0DAA)E9AD:9O)lj:)1ÐP1~19~jD@Ntf.fD<{xtYytz#Ð@ ^g @T@~>"fZfDuF@ff._HufwD RÁ.@@DwDDff.f.f.f.f.f.f.f.f.1Ht=?:tDHH9t+u<@tHH9uf.HtHH@f.HH9t/u&tHH9uHtX tN tIL7 t? t:HH9t4u)DtHH9u1f.1Ht;HH9t&u'tHH9uD1f.HH9u&fDHH9tu1f.HH9u&fDHH9tu1f.HSHHt HHH[@ w Hnghttp2_helper.cdelta >= 0SuccessInvalid argumentOut of buffer spaceUnsupported SPDY versionOperation would blockProtocol errorInvalid frame octetsEOFData transfer deferredNo more Stream ID availableStream is closingStream ID is invalidInvalid stream stateGOAWAY has already been sentInvalid header blockInvalid stateFlow control errorToo many inflight SETTINGSStream was refusedInternal errorCancelOut of memoryUnknown error codeunknownNO_ERRORPROTOCOL_ERRORINTERNAL_ERRORFLOW_CONTROL_ERRORSETTINGS_TIMEOUTSTREAM_CLOSEDFRAME_SIZE_ERRORREFUSED_STREAMCANCELCOMPRESSION_ERRORCONNECT_ERRORENHANCE_YOUR_CALMINADEQUATE_SECURITYHTTP_1_1_REQUIREDStream was already closed or invalidThe transmission is not allowed for this streamAnother DATA frame has already been deferredrequest HEADERS is not allowedThe user callback function failed due to the temporal errorThe length of the frame is invalidHeader compression/decompression errorInsufficient buffer size given to functionCallback was paused by the applicationServer push is disabled by peerDATA or HEADERS frame has already been submitted for the streamThe current session is closingInvalid HTTP header field was receivedViolation in HTTP messaging ruleWhen a local endpoint expects to receive SETTINGS frame, it receives an other type of frameThe user callback function failedReceived bad client magic byte stringFlooding was detected in this HTTP/2 session, and it must be closedSETTINGS frame contained more than the maximum allowed entriesToo many CONTINUATION frames following a HEADER framenghttp2_increase_local_window_size  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx 0DXl(Pwb@f F 646HDWd #';Pctp    0@(p P9Gpiz`b@fF66P!(pDOWNCASE_TBL__PRETTY_FUNCTION__.4681VALID_HD_NAME_CHARSVALID_HD_VALUE_CHARSVALID_METHOD_CHARSVALID_PATH_CHARSVALID_AUTHORITY_CHARSCSWTCH.22nghttp2_put_uint16benghttp2_put_uint32benghttp2_get_uint16nghttp2_get_uint32nghttp2_downcasenghttp2_adjust_local_window_sizenghttp2_increase_local_window_size__assert_failnghttp2_should_send_window_updatenghttp2_strerrornghttp2_check_header_namenghttp2_check_header_valuenghttp2_check_header_value_rfc9113nghttp2_check_methodnghttp2_check_pathnghttp2_check_authoritynghttp2_cpymemmemcpynghttp2_http2_strerrorZ X b g l X 3 F S  b I b h  8# 4 G R c t   A ,  `   $$ 7 OH _ (p    X   5 8  ! 1 A xQ }z    A V    . ]#t    (0(89@HHOPaXo`h 4H \0p@p p`$8LPhp.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rodata.str1.8.rela.rodata.comment.note.GNU-stack.rela.eh_frame @@`" &,12@2p T@ O@(P \0.e.z0xu@h) x  ?+nghttp2_alpn.o/ 1713297051 399 399 100644 2232 ` ELF>x@@ AWAVAUATUSDH(A9H|$Ht$w_DIMHD$E1fDAEtA9wGEHT$LO<LuAVHL$IL!AHL$H([]A\A]A^A_H([]A\A]A^A_@AUAAAATIUHSHH)At)AA DLHHE1AAHD[]A\A]AUAAAATIUHSHHAt)AA DLHHE1AAHD[]A\A]h2http/1.1GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx \BGB B(A0C8G`r 8A0A(B BBBD D8F0A(B BBB4|hBQD D(G0|(D ABB4hBQD D(G0|(D ABB-h% hmemcmpnghttp2_select_next_protocolnghttp2_select_alpnd  $ S   .symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @@Px &,12@0.I^Y@H    9hnghttp2_hd.o/ 1713297051 399 399 100644 45240 ` ELF>@@AAAPHc҉!H9w>H) HGHvDHHʀHPw@0HH) Ƹ@7DAVHAATUSHD$(I9$MA݃IADEAD9DA9vHIIL9A݃I|EDAD9wnDD9r`Ax[]IBLDA\L)A^HL$0AAADA" A8Dt'D[]A\A^f[]A\HA^fMQI9DfL)[]A\LDA^1ff.USHHHv9HFHvZHHHJHwHjHv *fDH$ HHHH[]ýfDHSH$[ÐnuH[yuH8[GH;HFHCHFHCHHPH@HC(HFHSHPH@HS HC0FHC@CLC8H{[f.AWAVAUIATUSHH(HHVL$HO Lg(Ht$HjHhH $HO0H JD%H9fIuHLvLLHxH0IHH+GH+FMuLHIE(tCAWLHHt3I9u q@HHP@HtI9uH@IW@HIIG@I?H<$LMe(IM0JD%H9I1H9vH([]A\A]A^A_HH<$PHHHD$ZHt$IMIEHQHH9HAML9wJ4H<$HHD$MeE1Mt"DLLHL$JIM9uIuH<$Ht$IEIOHIMIuHIUH!HL$HH IEAE8PAU8AHD$ALtD$HH\$HHtHS@HIm(H(1[]A\A]A^A_I}IuHW됾AH\$H{H;H<$H{hf.AUATIUSHH(HLHuH,$D$H}Ll$PD$uSH$I$HD$ID$HD$ID$H1LHǃHǃH([]A\A]fD11HHuH,$Ll$fSHHH;[f.ATIUHSHW G<HG0@HۃuH4HHHEH}@HHEH]HE@HE(E8@@1Hu^uAu,IvcƅPL@HH1[]A\fIw2f1HfGtHtƅPLe0H\E@H}Af71HfO/{m@HUSHHHHs C<HC0f.HuH4HHH{HHHHkHCHCHC(C8HǃHǃHǃǃǃH{pHǃHǃ1ƃHǃHǃHǃƃƃH[]ø{fHw SHHHHHǃHǃHHs H[)fHH@ƇPH9HGHHHw0H9HGHHHw@1H@f.wG1H;w0HrHHHw0LJ1D$ ,D$ Hf.SHFHHH=H9vXHAWكv5A-t/A6t)IV0HL$IL$HRH HH9ɉL$D$D${I|$wD$D$^L$IcHD$HoHLEHEl$HIHAHA=&IcHHD;HSI;WuIwH;uMIIuH~IEH|DHHHJHwHZHw{H|$PD$PH|$(Ht$PHM>f.HL$HH|$ŝHHfH1iH9u$qT$H|$(L=l$LEILl$HYD$uIHL$ HT$H|$PHt$^HHƇPHHHG0H9sH|$(UIv0HH|$(:EŝJ@ATMUHSHH@HO HtHH@[]A\@HLHHHHH tHcHDH@[]A\H{f.ATMUHSHH@HO HtHH@[]A\@HLHHHHH tHcHDH@[]A\H{f.HRHH t HHHFH(HFH9uf.AUIATIUSHHHtXXHHHtSHLHuIm1H[]A\A]HH߉D$ D$ H[]A\A]fHfD{f1ifUSHHHo H[HHH[]f.AWHAVIAUATUHSJHh<Lg Ht$ DL$D$< HIIIINpIv@IdžIdž1AEHL$IHt$H $L9…A h$AAdž IdžIdžAHt$$u͕%o&vp'y (wa+)>~*G0 +kZW,i - .l/~01 2f34f 4v5=@ 68+n7!8Lt 9%$:Eޫ@;,i<{.((idx) < (context)->hd_table.len + 61)GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx k`0TBTA A(  ALKH p  ABBC A  ABIC d  ABHA (zAAG0g AAA k KS B d D d D K E h H r F [ E r F r F h H R F h H z F R F X H Z F @ H C A ^ A  A ^ A  A ^ A ^ A ^ A ^ A ^ A ^ A ^ A ^ A ^ A ^ A ^ A ^ A ^L^ B ^ B ^ B ^ B ^ B ^ B f J G I  A ^ B  A ^ B ^ B ^ A ^ A ^ A ^ A ^TP-BBH G(D0D@ 0A(A BBBA x 0A(A BBBA (YBGA } DBC 0W[Dd H M E H{BBD A(D0Q (D ABBI D(A ABBTDHhBBE B(A0A8DP 8A0A(B BBBA SR^0ZADI X AAH `DAHBBF B(D0D8GP 8A0A(B BBBA (LqAMG8M AAD xfA`dBBB E(A0A8G` 8A0A(B BBBA 2 8C0A(B BBBA 8BBD A(GP (A ABBG 8AP,TlBID  ABC  ('AKJ  AAA  WAQBD} Vd h $A@ G c A (HAGG` AAC LtBBE B(A0A8G 8A0A(B BBBD @yBDD G`V  AABE {  AABA @yBDD G`V  AABE {  AABA `t3HBED A(G@v (A ABBA W (A ABBC $&AAG PGA|BIE B(A0D8HD 8A0A(B BBBC @ 8A0A(B BBBF . 8D0D(B BBBB $VADG@GAA@A~@BDA G0s  AABK W  AABE @ $T #AAG MDD|      #   0 #D X kpTzPk  -( A YVP 0ed~ [ {`P"S2 ZK@f q0   "9G^fl( @ 'XiP `WBVp&p y=Te| !y!!3!$`";p"&R"k}*V** +@)@+A+X+#o, ,0,@,P, `,#+,U,, ,#,-encode_lengthlookup_tokenemit_string__PRETTY_FUNCTION__.5202hd_inflate_read_huffhd_ringbuf_get__PRETTY_FUNCTION__.5064nghttp2_hd_table_get2static_table__PRETTY_FUNCTION__.5307hd_ringbuf_freehd_ringbuf_pop_back.isra.6.part.7__PRETTY_FUNCTION__.5097hd_context_shrink_table_sizepack_first_byte__PRETTY_FUNCTION__.5210emit_indname_block.isra.14hd_inflate_read_len.constprop.19add_hd_table_incrementalhd_inflate_commit_newname__PRETTY_FUNCTION__.5300hd_inflate_commit_indnamenghttp2_bufs_addmemcmpnghttp2_hd_huff_encode_countnghttp2_hd_huff_encode__assert_failnghttp2_hd_huff_decodenghttp2_hd_huff_decode_failure_statenghttp2_rcbuf_decrefnghttp2_mem_freenghttp2_bufs_addbnghttp2_hd_entry_initnghttp2_rcbuf_increfnghttp2_mem_mallocnghttp2_hd_entry_freenghttp2_hd_deflate_init2nghttp2_hd_deflate_initnghttp2_hd_inflate_initnghttp2_buf_initnghttp2_hd_deflate_freenghttp2_hd_inflate_freenghttp2_hd_deflate_change_table_sizenghttp2_hd_inflate_change_table_sizenghttp2_hd_table_getnghttp2_hd_deflate_hd_bufsnghttp2_rcbuf_new2nghttp2_hd_deflate_hd2nghttp2_bufs_wrap_initnghttp2_bufs_lennghttp2_bufs_wrap_freenghttp2_hd_deflate_hdnghttp2_hd_deflate_hd_vec2nghttp2_bufs_wrap_init2nghttp2_hd_deflate_hd_vecnghttp2_hd_deflate_boundnghttp2_hd_deflate_new2nghttp2_mem_defaultnghttp2_hd_deflate_newnghttp2_hd_deflate_delnghttp2_hd_inflate_hd_nvnghttp2_rcbuf_newnghttp2_buf_wrap_initnghttp2_cpymemnghttp2_hd_huff_decode_context_initnghttp2_hd_inflate_hd3nghttp2_hd_inflate_hd2nghttp2_hd_inflate_hdnghttp2_hd_inflate_end_headersnghttp2_hd_inflate_new2nghttp2_hd_inflate_newnghttp2_hd_inflate_delnghttp2_hd_emit_indname_blocknghttp2_hd_emit_newname_blocknghttp2_hd_emit_table_sizenghttp2_hd_decode_lengthnghttp2_hd_deflate_get_num_table_entriesnghttp2_hd_deflate_get_table_entrynghttp2_hd_deflate_get_dynamic_table_sizenghttp2_hd_deflate_get_max_dynamic_table_sizenghttp2_hd_inflate_get_num_table_entriesnghttp2_hd_inflate_get_table_entrynghttp2_hd_inflate_get_dynamic_table_sizenghttp2_hd_inflate_get_max_dynamic_table_size8#a  R$ 9$ $ &$# ($] b$ |$ $ m$- P2$[ `$  $ $% *$U `} $  -$C H$ $ a$ L$ S$  E$+ h0$L oQ$k Zp$ $ $ $ $ 5 $% (*$D I$c h$ $ $  $ $  $) . $I BN $i n $  $ ^ $ v $  $" ' $I N $j o $  $ 9 $ ? $ 3 $ ( $) #. $H M $g l $ ~ $  $ %` #w # # &  m z ' (' )h dr mw | '   m '* *++e Po mt y'9*A*N+   m ',#.**+=/X-/+**+*/a/44l*x***   0 m '9H.*} $:9I.b;w*$0*:*]  $%#; = : > ?!B=!:G!>R!?!/"1+"+A"F"*"*]# $J&$K$J$KG(L(L)M4)JF)Mi)J:*9*I +*+*\+/o+3+++F+6H+.*"+++hh` @(08@HHP`X`hxpxx@hhhhhhphhhhh (h08h@hHhPhX`hhpxhhhhyhhhhhhZhhhh;h h(b0h8h@hHhPhXh`hhhphx"'%%X'&8$g$`&(h##x%((8PX8PX8PX8PX8PX 8  P X       8 P X      %8 5P %X 5 C  C  S8 P SX  a  a  h8 P hX     8PX8PX8PX8PX8PX8PX""'8P'X,,38P3X;;@8P@XEEN8PNX``n8PnXww8PX8PX8PX8PX8PX8PX8PX)) ;8 P ;X  F  F !K8!P!KX!!O!!O! 4pPT  P   X`l@P |<X P`(pLxp  !d!x!!`"p""***+ @+D +X + ,  , 0, @, P, `, , , ,4 ,H ,\ -.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rela.rodata.rodata.str1.8.comment.note.GNU-stack.rela.eh_frame @-@ph &E-,E-12E-`E2" @@( M2T'\0T.eUzUh u@ئX _ # h'0/98 1713297051 399 399 100644 2856 ` ELF>(@@ Ht*H1fDHHH9uHH1@f.AWAVL4AUIATIUSHHHwH+w M911A 0HG HHH H H ʉI}HG M9twIAT$D)ًHH ŋHHvHwDHLH8HuJHHHwI}HwH+w fDHHHv)HLH8Ht@H[]A\A]A^A_Ht0H)H8L[ ]A\A]A^A_1@fUDSH fDT$D$H9HDJAIEAAMFJfExnMMAAIMFJfEyLVH9MZL^@AFsEfDtfA@t*H[]L^IkHn@AFqH@f.1f?GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx 2`0HBBF E(D0A8D@ 8A0A(B BBBA S 8L0F(B BBBH  $AE AD  2-@HDV z nghttp2_hd_huff_encode_counthuff_sym_tablenghttp2_hd_huff_encodenghttp2_bufs_addbnghttp2_hd_huff_decode_context_initnghttp2_hd_huff_decodehuff_decode_tablenghttp2_hd_huff_decode_failure_state    4     D   4@.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @@0  &,10.:O J@Px h  hY/120 1713297051 399 399 100644 19584 ` ELF>J@@   #*19@@012aceiost 001122aacceeiioo0 00(01 11(12 22(2a aa(a00 0000)08011 1111)18122 2222)282aa aaaa)a8ac cc(ce ee(ei ii(io oo(occ cccc)c8cee eeee)e8eii iiii)i8ioo oooo)o8osstt %-./3456789s ss(st tt(t  %%--..ss ssss)s8stt tttt)t8t  ( % %%(%- --(-. ..(.     ) 8 %% %%%%)%8%-- ----)-8-.. ....).8.//33445566778899/ //(/3 33(34 44(45 55(5// ////)/8/33 3333)38344 4444)48455 5555)5856 66(67 77(78 88(89 99(966 6666)68677 7777)78788 8888)88899 9999)989!"$%+.25:=AD@=A_bdfghlmnpru&'==AA__bbddffgghh= ==(=A AA(A_ __(_b bb(b== ====)=8=AA AAAA)A8A__ ____)_8_bb bbbb)b8bd dd(df ff(fg gg(gh hh(hdd dddd)d8dff ffff)f8fgg gggg)g8ghh hhhh)h8hllmmnnpprruu:BCDl ll(lm mm(mn nn(np pp(pll llll)l8lmm mmmm)m8mnn nnnn)n8npp pppp)p8pr rr(ru uu(u::BBCCDDrr rrrr)r8ruu uuuu)u8u: ::(:B BB(BC CC(CD DD(D:: ::::):8:BB BBBB)B8BCC CCCC)C8CDD DDDD)D8D,-/03467;<>?BCEH@EFGHIJKLMNOPQRSTEEFFGGHHIIJJKKLLE EE(EF FF(FG GG(GH HH(HEE EEEE)E8EFF FFFF)F8FGG GGGG)G8GHH HHHH)H8HI II(IJ JJ(JK KK(KL LL(LII IIII)I8IJJ JJJJ)J8JKK KKKK)K8KLL LLLL)L8LMMNNOOPPQQRRSSTTM MM(MN NN(NO OO(OP PP(PMM MMMM)M8MNN NNNN)N8NOO OOOO)O8OPP PPPP)P8PQ QQ(QR RR(RS SS(ST TT(TQQ QQQQ)Q8QRR RRRR)R8RSS SSSS)S8STT TTTT)T8TUVWYjkqvwxyzFGIJ@UUVVWWYYjjkkqqvvU UU(UV VV(VW WW(WY YY(YUU UUUU)U8UVV VVVV)V8VWW WWWW)W8WYY YYYY)Y8Yj jj(jk kk(kq qq(qv vv(vjj jjjj)j8jkk kkkk)k8kqq qqqq)q8qvv vvvv)v8vwwxxyyzz&*,;XZKNw ww(wx xx(xy yy(yz zz(zww wwww)w8wxx xxxx)x8xyy yyyy)y8yzz zzzz)z8z&&**,,;;XXZZLMOQ& &&(&* **(*, ,,(,; ;;(;&& &&&&)&8&** ****)*8*,, ,,,,),8,;; ;;;;);8;X XX(XZ ZZ(Z!"()?PRTXX XXXX)X8XZZ ZZZZ)Z8Z!!""(())??'+|SUX! !!(!" ""("( (((() ))()!! !!!!)!8!"" """")"8"(( (((()(8()) ))))))8)? ??(?''++||#>VWYZ?? ????)?8?' ''('+ ++(+'' '''')'8'++ ++++)+8+| ||(|##>>$@[]~[\|| ||||)|8|# ##(#> >>(>## ####)#8#>> >>>>)>8>$$@@[[]]~~^}]^ ($ $$($@ @@(@[ [[([ )8$$ $$$$)$8$@@ @@@@)@8@[[ [[[[)[8[] ]](]~ ~~(~^^}}<`{_]] ]]]])]8]~~ ~~~~)~8~^ ^^(^} }}(}<<``{{`n^^ ^^^^)^8^}} }}}})}8}< <<(<` ``(`{ {{({aeo<< <<<<)<8<`` ````)`8`{{ {{{{){8{bcfipw\dghjkqtx~\\lm\ \\(\ ( (\\ \\\\)\8\ )8 )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8rsuvy{z|} ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8  ( ( ( ( )8 )8 )8 )8 (   )8  (  (     ) 8  )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( )8 )8 )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8  ( )8 ( ( )8 )8 ( ( ( ( )8 )8 )8 )8     (  (   (  ( )8     ) 8      ) 8  )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( ( ( )8 )8 )8 )8 ( ( (  )8 )8 )8      (   (  (     ) 8      ) 8  )8  0@P`p 0@P`pP @ T @  `X\`dhlptx|    (08@H  `HpLPTX\`dhlptx|@ @@ @ (@`08@@ @`GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)@@@@huff_decode_tablehuff_sym_table.symtab.strtab.shstrtab.text.data.bss.rodata.comment.note.GNU-stack@!@'@,@HH 40H.=HH I"IM/147 1713297051 399 399 100644 1592 ` ELF>@@ 1=HL=1.61.0h2GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx   nghttp2_version  .symtab.strtab.shstrtab.rela.text.rela.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @@ +`&@0 1x62x E0.Nc0^@0   Hm/166 1713297051 399 399 100644 1632 ` ELF>@@ ɉ7WG@GG@f.1ut1fDG~=~GfGGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx  0DX( ?0cP(nghttp2_priority_spec_initnghttp2_priority_spec_default_initnghttp2_priority_spec_check_defaultnghttp2_priority_spec_normalize_weight 4H0\P.symtab.strtab.shstrtab.text.data.bss.comment.note.GNU-stack.rela.eh_frame@x!',0.5JhE@`P  XHT/191 1713297051 399 399 100644 3792 ` ELF> @@ SHHH%{[f.f.O8wHO8w<O8wLO8wPO8w@@ vO8 Ddff.@ t2@t@ t@O8OD@O8OD@O8ODff.O8@wTO8Hw@O8Hw@O8wXDO8Hw @O8Hw(@O8 w\DO8@w`DO8H7HWÐO8Hw0GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx #Aa8L`t$D   ( < P d x #0.3@\P`p$3Db  0 @ P 1` Qp   nghttp2_option_newcallocnghttp2_option_delfreenghttp2_option_set_no_auto_window_updatenghttp2_option_set_peer_max_concurrent_streamsnghttp2_option_set_no_recv_client_magicnghttp2_option_set_no_http_messagingnghttp2_option_set_max_reserved_remote_streamsnghttp2_option_set_user_recv_extension_typenghttp2_option_set_builtin_recv_extension_typenghttp2_option_set_no_auto_ping_acknghttp2_option_set_max_send_header_block_lengthnghttp2_option_set_max_deflate_dynamic_table_sizenghttp2_option_set_no_closed_streamsnghttp2_option_set_max_outbound_acknghttp2_option_set_max_settingsnghttp2_option_set_server_fallback_rfc7540_prioritiesnghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validationnghttp2_option_set_stream_reset_rate_limitnghttp2_option_set_max_continuations1 <0P@dPx`p 0@,P@`Tph|.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @@x 0 &,10.:O J@    `p Y/209 1713297051 399 399 100644 5392 ` ELF>@@ SHHH%{[f.f.H7ff.HwÐf.HwÐf.HwÐf.Hw Ðf.Hw(Ðf.Hw0Ðf.Hw8Ðf.Hw@Ðf.HwHÐf.HwPÐf.HwXÐf.Hw`Ðf.HwhÐf.HwpÐf.HwxÐf.HHHHHHHHHHHHGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx #Aa8L`t(<Pdx,@Th#&0DI@uP`p0mN  Y0@P`?pSnghttp2_session_callbacks_newcallocnghttp2_session_callbacks_delfreenghttp2_session_callbacks_set_send_callbacknghttp2_session_callbacks_set_send_callback2nghttp2_session_callbacks_set_recv_callbacknghttp2_session_callbacks_set_recv_callback2nghttp2_session_callbacks_set_on_frame_recv_callbacknghttp2_session_callbacks_set_on_invalid_frame_recv_callbacknghttp2_session_callbacks_set_on_data_chunk_recv_callbacknghttp2_session_callbacks_set_before_frame_send_callbacknghttp2_session_callbacks_set_on_frame_send_callbacknghttp2_session_callbacks_set_on_frame_not_send_callbacknghttp2_session_callbacks_set_on_stream_close_callbacknghttp2_session_callbacks_set_on_begin_headers_callbacknghttp2_session_callbacks_set_on_header_callbacknghttp2_session_callbacks_set_on_header_callback2nghttp2_session_callbacks_set_on_invalid_header_callbacknghttp2_session_callbacks_set_on_invalid_header_callback2nghttp2_session_callbacks_set_select_padding_callbacknghttp2_session_callbacks_set_select_padding_callback2nghttp2_session_callbacks_set_data_source_read_length_callbacknghttp2_session_callbacks_set_data_source_read_length_callback2nghttp2_session_callbacks_set_on_begin_frame_callbacknghttp2_session_callbacks_set_send_data_callbacknghttp2_session_callbacks_set_pack_extension_callbacknghttp2_session_callbacks_set_pack_extension_callback2nghttp2_session_callbacks_set_unpack_extension_callbacknghttp2_session_callbacks_set_on_extension_chunk_recv_callbacknghttp2_session_callbacks_set_error_callbacknghttp2_session_callbacks_set_error_callback21 <0P@dPx`p,@Th |0@P`p0DXl.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @@0 &8,8108.:fOhxJ@   %Ynghttp2_mem.o/ 1713297051 399 399 100644 2656 ` ELF> @@ f.f.f.f.f.HHGH7HHHGH7HHHHDHHGHHH@f.HHG HHHGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx 0DXl   -0D(o\<@PPc`tp default_reallocdefault_callocdefault_freedefault_mallocnghttp2_mem_defaultnghttp2_mem_mallocnghttp2_mem_freenghttp2_mem_free2nghttp2_mem_callocnghttp2_mem_reallocA   !10   4H \0p@P`p.symtab.strtab.shstrtab.rela.text.rela.data.bss.comment.note.GNU-stack.rela.eh_frame @@x +( &@p` 1(60(.?VTXO@ 8  H^nghttp2_http.o/ 1713297051 399 399 100644 11512 ` ELF>8)@@HtK1HH9t7 DIDA ADG DQDI AAFA8t1f.HtlPЀ wa0HWHH1H IfDHH9t@DAHЀ w$H9H AMȃ0HHHI)L9~H@f.%tvѸu't"ƀtсu u(1~ tfDHG0DuӁtfD uHG01~ uf JfcvBu"f0tfttEHG01fHG01D%HG0@f11Df.F Ѓ@@uHW01Ht1H;W8@f.Hw8@Hw8uHW01Ht1H9fDAUIATUSHF <tk<uWH^Lf MtJ1fDHH(L9t3H{uH3~duuHCHtNHt H[]A\A]DH^(Lf0fDHsuA@HsuA@ATUHSHPD'_H|$DHT$0H|$HuJH|$uH$'Ä́DE,$mDHSHzE,$8H}0HCHpHxHHE0zHSHzkE,$HCHxIHp)HCHxHpA:~1if=HPfcf-fcw FH}0HCHpHxHHE0Ee뉋 yHSHJHh HUHz?fef6fu+A:fDA:fHr}A DE,$E E,$0Hr5uH}0HCHxzHp_HE0HpJADE,$< OD ADE,$YHHCHHPHptI% HH@D( HHH@D(:methoCONNECTHEADnghttp2_http.cnv->name->len > 0OPTIONShttphttpstrailers0nghttp2_http_on_headerGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx V0DXl 2:8BEA A(D0g (A ABBF <BAD Dp  AADA D FABl$BEE D(D0G@m 0A(A BBBH t 0F(A BBBG } 0C(A BBBA V`  ,Lm@ P2:.`E_zmemieqparse_uint__PRETTY_FUNCTION__.6018nghttp2_http_on_request_headersnghttp2_http_on_response_headersnghttp2_http_on_trailer_headersnghttp2_http_on_remote_end_streamnghttp2_http_on_data_chunknghttp2_http_record_request_methodmemcmpnghttp2_http_parse_prioritysf_parser_initsf_parser_dictnghttp2_http_on_headernghttp2_check_header_namenghttp2_check_header_valuenghttp2_check_pathnghttp2_check_header_value_rfc9113nghttp2_check_methodnghttp2_check_authoritynghttp2_extpri_from_uint8__assert_failnghttp2_extpri_to_uint8# (j o ;O vd  H M ) HY Hu = B Q% * f 5k      #   @  @ (>0@ 8@ @@ H@ P@ X@ `@ h@ p@ x@ @ @ @ @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ @ ( 0@ 8@ @@ H@ P@ X@ `@ h@ p@ x@ @ @ @ @ @ @ @ @ h@ @ @ @  hhhh  (X 0X 8X @X HX PX XX `X hX pX xX X X X X X X X X { X X X X X X X X X X X X (X 0X 8X @X HX PX XX `X hX pX xX X X X X X hX X X X @ hhhh 4`H\p@P(`.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rela.rodata.comment.note.GNU-stack.rela.eh_frame @( @0 &h ,h 12h SE @@ M0.Vkf@'   (unghttp2_rcbuf.o/1713297051 399 399 100644 2856 ` ELF>@@ ATIHv(UHSHHHt6HHUH(HMHPHHJHHBHL`@ 1[]A\ø{DAUIATIUHHHuSHuI$HLHxHhH[]A\A]@HHHG tG HtG t~!G tHGHHHPX@HWHG1 nghttp2_rcbuf.crcbuf->ref > 0nghttp2_rcbuf_decrefGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx ,[BHD B ABA 4LLBED K(D0i(C ABBLs   [,?`LRasL  0 __PRETTY_FUNCTION__.4072nghttp2_rcbuf_newnghttp2_mem_mallocnghttp2_rcbuf_new2nghttp2_cpymemnghttp2_rcbuf_delnghttp2_mem_free2nghttp2_rcbuf_increfnghttp2_rcbuf_decref__assert_failnghttp2_rcbuf_get_bufnghttp2_rcbuf_is_static {      P` 0.symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rodata.comment.note.GNU-stack.rela.eh_frame @:@ &z,z12z@H0.Qfa@   8p/230 1713297051 399 399 100644 1592 ` ELF>8@@ G fD@w@f.GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx  0D 30Qnghttp2_extpri_to_uint8nghttp2_extpri_from_uint8nghttp2_extpri_parse_prioritynghttp2_http_parse_priority1 4H0.symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @5@x &u,u10u.:OXJ@H   mY/248 1713297051 399 399 100644 1552 ` ELF>P@@ H7HwHWHGff.HGH9t7r=HwHwHHGHHH9r@@ HHH$tHHfD11HHEHHGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx AD ] G UAnghttp2_time_now_secclock_gettime + .symtab.strtab.shstrtab.rela.text.data.bss.comment.note.GNU-stack.rela.eh_frame @A@0 &,10.:O8J@0   $HYnghttp2_debug.o/1713297051 399 399 100644 1208 ` ELF>@@ GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx nghttp2_set_debug_vprintf_callback .symtab.strtab.shstrtab.text.data.bss.comment.note.GNU-stack.rela.eh_frame@!B'B,0B.5pJp0E@  `$Tsfparse.o/ 1713297051 399 399 100644 23880 ` ELF>HY@@HHOH9t@ t tÐHH9HufH<*t rda<w]LGHAHL9t-*Pw"$HL9Hu@HtH)HHF1fD1Df.SHGHH;St*:,uHHH%HCH9[ø[f.SH8-LWL9iA11%f.A0HH McL9HI Ht8DEHA wHHu͸[fDHHtL9tA.tEHLF1L^[LWHHL9tI\@H wHL9Hu!@A0HH McL9HI Ht!DEHA wHHuK1[H9ڐ=H)H0HtLHFL^tHtHuHF 1[HFd1[HF1[ù@SHH H0VހXw$~7H [DHH;GHtH u܃<$uHtH$HHT$HSHT$HSHwHHH9tHE1[f# t!Ht!H1H)DCHHsHEHSH1H;fDHwHPHH9 !]$H(H [fHwHHHH9 +O$HPH;WHP01HHHC1SrDHH9H<HWH)HCCHSH 1[\HQH9HI"t \AHJH9HMf.HHH)HHR0G$H)ƒHHt$H1H)CHHsHEHKH1HOf.HH9HW+HHQH9Hy:t f.1ef1fJA6I@@IHJH9Hz=tSHHGrWu2HH{H9t )H[fDHHH9t u,HPfDHRJ uH9HHufD)tkHuSSH[DHt$Ht$/P@HPfHRJ uH9HHu"HHCCSH1Ht'tt1[@UHSHHOȃ}uXHHKH98;HPH9Ht%x uuHHx u^H9HuH[]fHt$uɋKHt$Kd@HuHHSH9t8=t+Ht\EE1EH[]HH9HRHHH[]K11*SH11Ht-tt"f1[ff.ATIUHSGH tvI t unu'H}uH!uLHt^[]A\fu,HHOH9t8 uHH9Hu[]A\DxHHSH9t8=t/HtEEEC 1[]A\HHH9H tMx(u(HtEEHC H1(HHC Df.UHSHHGtvjt#fuFHu:Hu.H(usHtEEHCH1H[]ÐudHHwH9t(HP tfHRJ uH9HHuH[]@HHuCH[]Df.SGHtvbt"@u>Hu2H HSH9t!9 HAt\@Hx uNH9Hu[u?456789:;<=  !"#$%&'()*+,-./0123sf_base64decodesf_parser_itemsf_parser_listsf_parser_dictparser_skip_paramssf_parser_inner_listparser_numberparser_skip_inner_listsf_parser_paramsfparse.c!parser_eof(sfp)0(src->len & 0x3) == 0i > 2*p == '=' && p + 1 == end*p == '=' && *(p + 1) == '=' && p + 2 == endGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)zRx .0vDCAz A F<dAh G t D s A N A K A K A 4AG0q AF  AC  CH ,=AG @ AG  AF  <Az@(MADG0o AAC  AAI T GAL lDABDQBDD I ABJ b AGF U ABH @ADG p AAB | FAE Z AAD (Ag H ~ B } C c@7\TBBB B(A0A8DP 8A0A(B BBBD [8A0A(B BBB$A E W A .0vC7Eu^o` Dp<@./H W   p~0=MP Q   7 parser_discard_owsparser_keyparser_next_key_or_itemparser_number__PRETTY_FUNCTION__.2930parser_bare_item__PRETTY_FUNCTION__.3398parser_skip_paramsparser_skip_inner_list__PRETTY_FUNCTION__.3408__PRETTY_FUNCTION__.3372__PRETTY_FUNCTION__.3382__PRETTY_FUNCTION__.3430__PRETTY_FUNCTION__.3442__PRETTY_FUNCTION__.3454index_tbl.3475__PRETTY_FUNCTION__.3482__assert_failsf_parser_inner_listsf_parser_paramsf_parser_dictsf_parser_listsf_parser_itemsf_parser_initsf_unescapememcpymemchrsf_base64decoded  u     P  @;   `  z   1 ; @ E  @) . 3  .       q {   t # $ #\  , 6 ; @E O T 9Y^ h m rw   3pp p(0p8p@pHpPpXp`phpppxp (08@HPX`hpxpppppppppppppp p(p0p8p@pHpPpXp`phpppxpp( (08@HPX`hpx (08@HPX`hpx (08@HPhX`hhhphxhhhhhhhhhhhhhhhhhh (08@HPhXh`hhhphxhhhhhhhhhhhhhhhhhhhhh (08h@hHhPhXh`hhhphxhhhhhhhhhhhhhhhhhhhhh (h08h@HPX`hpx@     ( 0 8 @ H P X ` h p x                      ( 0 8 @ H P X ` h p x                      ( 0 8 @ H P X ` h p x                      ( 0 8 @ H P X ` h p x                  40Hh0p,p P   D X .symtab.strtab.shstrtab.rela.text.data.bss.rela.rodata.rodata.str1.1.rodata.str1.8.comment.note.GNU-stack.rela.eh_frame @@* &,6 1@X0' >2!SM2!-\0%".eS"zX"u@XWh 0% ( XPK8hZ+q+qshare/man/man1/nghttpx.1nu[.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "NGHTTPX" "1" "Apr 04, 2024" "1.61.0" "nghttp2" .SH NAME nghttpx \- HTTP/2 proxy .SH SYNOPSIS .sp \fBnghttpx\fP [OPTIONS]... [ ] .SH DESCRIPTION .sp A reverse proxy for HTTP/3, HTTP/2, and HTTP/1. .INDENT 0.0 .TP .B Set path to server\(aqs private key. Required unless \(dqno\-tls\(dq parameter is used in \fI\%\-\-frontend\fP option. .UNINDENT .INDENT 0.0 .TP .B Set path to server\(aqs certificate. Required unless \(dqno\-tls\(dq parameter is used in \fI\%\-\-frontend\fP option. To make OCSP stapling work, this must be an absolute path. .UNINDENT .SH OPTIONS .sp The options are categorized into several groups. .SS Connections .INDENT 0.0 .TP .B \-b, \-\-backend=(,|unix:)[;[[:...]][[;]...] Set backend host and port. The multiple backend addresses are accepted by repeating this option. UNIX domain socket can be specified by prefixing path name with \(dqunix:\(dq (e.g., unix:/var/run/backend.sock). .sp Optionally, if s are given, the backend address is only used if request matches the pattern. The pattern matching is closely designed to ServeMux in net/http package of Go programming language. consists of path, host + path or just host. The path must start with \(dq\fI/\fP\(dq. If it ends with \(dq\fI/\fP\(dq, it matches all request path in its subtree. To deal with the request to the directory without trailing slash, the path which ends with \(dq\fI/\fP\(dq also matches the request path which only lacks trailing \(aq\fI/\fP\(aq (e.g., path \(dq\fI/foo/\fP\(dq matches request path \(dq\fI/foo\fP\(dq). If it does not end with \(dq\fI/\fP\(dq, it performs exact match against the request path. If host is given, it performs a match against the request host. For a request received on the frontend listener with \(dqsni\-fwd\(dq parameter enabled, SNI host is used instead of a request host. If host alone is given, \(dq\fI/\fP\(dq is appended to it, so that it matches all request paths under the host (e.g., specifying \(dqnghttp2.org\(dq equals to \(dqnghttp2.org/\(dq). CONNECT method is treated specially. It does not have path, and we don\(aqt allow empty path. To workaround this, we assume that CONNECT method has \(dq\fI/\fP\(dq as path. .sp Patterns with host take precedence over patterns with just path. Then, longer patterns take precedence over shorter ones. .sp Host can include \(dq*\(dq in the left most position to indicate wildcard match (only suffix match is done). The \(dq*\(dq must match at least one character. For example, host pattern \(dq*.nghttp2.org\(dq matches against \(dqwww.nghttp2.org\(dq and \(dqgit.ngttp2.org\(dq, but does not match against \(dqnghttp2.org\(dq. The exact hosts match takes precedence over the wildcard hosts match. .sp If path part ends with \(dq*\(dq, it is treated as wildcard path. The wildcard path behaves differently from the normal path. For normal path, match is made around the boundary of path component separator,\(dq\fI/\fP\(dq. On the other hand, the wildcard path does not take into account the path component separator. All paths which include the wildcard path without last \(dq*\(dq as prefix, and are strictly longer than wildcard path without last \(dq*\(dq are matched. \(dq*\(dq must match at least one character. For example, the pattern \(dq\fI/foo*\fP\(dq matches \(dq\fI/foo/\fP\(dq and \(dq\fI/foobar\fP\(dq. But it does not match \(dq\fI/foo\fP\(dq, or \(dq\fI/fo\fP\(dq. .sp If is omitted or empty string, \(dq\fI/\fP\(dq is used as pattern, which matches all request paths (catch\-all pattern). The catch\-all backend must be given. .sp When doing a match, nghttpx made some normalization to pattern, request host and path. For host part, they are converted to lower case. For path part, percent\-encoded unreserved characters defined in RFC 3986 are decoded, and any dot\-segments (\(dq..\(dq and \(dq.\(dq) are resolved and removed. .sp For example, \fI\%\-b\fP\(aq127.0.0.1,8080;nghttp2.org/httpbin/\(aq matches the request host \(dqnghttp2.org\(dq and the request path \(dq\fI/httpbin/get\fP\(dq, but does not match the request host \(dqnghttp2.org\(dq and the request path \(dq\fI/index.html\fP\(dq. .sp The multiple s can be specified, delimiting them by \(dq:\(dq. Specifying \fI\%\-b\fP\(aq127.0.0.1,8080;nghttp2.org:www.nghttp2.org\(aq has the same effect to specify \fI\%\-b\fP\(aq127.0.0.1,8080;nghttp2.org\(aq and \fI\%\-b\fP\(aq127.0.0.1,8080;www.nghttp2.org\(aq. .sp The backend addresses sharing same are grouped together forming load balancing group. .sp Several parameters are accepted after . The parameters are delimited by \(dq;\(dq. The available parameters are: \(dqproto=\(dq, \(dqtls\(dq, \(dqsni=\(dq, \(dqfall=\(dq, \(dqrise=\(dq, \(dqaffinity=\(dq, \(dqdns\(dq, \(dqredirect\-if\-not\-tls\(dq, \(dqupgrade\-scheme\(dq, \(dqmruby=\(dq, \(dqread\-timeout=\(dq, \(dqwrite\-timeout=\(dq, \(dqgroup=\(dq, \(dqgroup\-weight=\(dq, \(dqweight=\(dq, and \(dqdnf\(dq. The parameter consists of keyword, and optionally followed by \(dq=\(dq and value. For example, the parameter \(dqproto=h2\(dq consists of the keyword \(dqproto\(dq and value \(dqh2\(dq. The parameter \(dqtls\(dq consists of the keyword \(dqtls\(dq without value. Each parameter is described as follows. .sp The backend application protocol can be specified using optional \(dqproto\(dq parameter, and in the form of \(dqproto=\(dq. should be one of the following list without quotes: \(dqh2\(dq, \(dqhttp/1.1\(dq. The default value of is \(dqhttp/1.1\(dq. Note that usually \(dqh2\(dq refers to HTTP/2 over TLS. But in this option, it may mean HTTP/2 over cleartext TCP unless \(dqtls\(dq keyword is used (see below). .sp TLS can be enabled by specifying optional \(dqtls\(dq parameter. TLS is not enabled by default. .sp With \(dqsni=\(dq parameter, it can override the TLS SNI field value with given . This will default to the backend name .sp The feature to detect whether backend is online or offline can be enabled using optional \(dqfall\(dq and \(dqrise\(dq parameters. Using \(dqfall=\(dq parameter, if nghttpx cannot connect to a this backend times in a row, this backend is assumed to be offline, and it is excluded from load balancing. If is 0, this backend never be excluded from load balancing whatever times nghttpx cannot connect to it, and this is the default. There is also \(dqrise=\(dq parameter. After backend was excluded from load balancing group, nghttpx periodically attempts to make a connection to the failed backend, and if the connection is made successfully times in a row, the backend is assumed to be online, and it is now eligible for load balancing target. If is 0, a backend is permanently offline, once it goes in that state, and this is the default behaviour. .sp The session affinity is enabled using \(dqaffinity=\(dq parameter. If \(dqip\(dq is given in , client IP based session affinity is enabled. If \(dqcookie\(dq is given in , cookie based session affinity is enabled. If \(dqnone\(dq is given in , session affinity is disabled, and this is the default. The session affinity is enabled per . If at least one backend has \(dqaffinity\(dq parameter, and its is not \(dqnone\(dq, session affinity is enabled for all backend servers sharing the same . It is advised to set \(dqaffinity\(dq parameter to all backend explicitly if session affinity is desired. The session affinity may break if one of the backend gets unreachable, or backend settings are reloaded or replaced by API. .sp If \(dqaffinity=cookie\(dq is used, the additional configuration is required. \(dqaffinity\-cookie\-name=\(dq must be used to specify a name of cookie to use. Optionally, \(dqaffinity\-cookie\-path=\(dq can be used to specify a path which cookie is applied. The optional \(dqaffinity\-cookie\-secure=\(dq controls the Secure attribute of a cookie. The default value is \(dqauto\(dq, and the Secure attribute is determined by a request scheme. If a request scheme is \(dqhttps\(dq, then Secure attribute is set. Otherwise, it is not set. If is \(dqyes\(dq, the Secure attribute is always set. If is \(dqno\(dq, the Secure attribute is always omitted. \(dqaffinity\-cookie\-stickiness=\(dq controls stickiness of this affinity. If is \(dqloose\(dq, removing or adding a backend server might break the affinity and the request might be forwarded to a different backend server. If is \(dqstrict\(dq, removing the designated backend server breaks affinity, but adding new backend server does not cause breakage. If the designated backend server becomes unavailable, new backend server is chosen as if the request does not have an affinity cookie. defaults to \(dqloose\(dq. .sp By default, name resolution of backend host name is done at start up, or reloading configuration. If \(dqdns\(dq parameter is given, name resolution takes place dynamically. This is useful if backend address changes frequently. If \(dqdns\(dq is given, name resolution of backend host name at start up, or reloading configuration is skipped. .sp If \(dqredirect\-if\-not\-tls\(dq parameter is used, the matched backend requires that frontend connection is TLS encrypted. If it isn\(aqt, nghttpx responds to the request with 308 status code, and https URI the client should use instead is included in Location header field. The port number in redirect URI is 443 by default, and can be changed using \fI\%\-\-redirect\-https\-port\fP option. If at least one backend has \(dqredirect\-if\-not\-tls\(dq parameter, this feature is enabled for all backend servers sharing the same . It is advised to set \(dqredirect\-if\-no\-tls\(dq parameter to all backends explicitly if this feature is desired. .sp If \(dqupgrade\-scheme\(dq parameter is used along with \(dqtls\(dq parameter, HTTP/2 :scheme pseudo header field is changed to \(dqhttps\(dq from \(dqhttp\(dq when forwarding a request to this particular backend. This is a workaround for a backend server which requires \(dqhttps\(dq :scheme pseudo header field on TLS encrypted connection. .sp \(dqmruby=\(dq parameter specifies a path to mruby script file which is invoked when this pattern is matched. All backends which share the same pattern must have the same mruby path. .sp \(dqread\-timeout=\(dq and \(dqwrite\-timeout=\(dq parameters specify the read and write timeout of the backend connection when this pattern is matched. All backends which share the same pattern must have the same timeouts. If these timeouts are entirely omitted for a pattern, \fI\%\-\-backend\-read\-timeout\fP and \fI\%\-\-backend\-write\-timeout\fP are used. .sp \(dqgroup=\(dq parameter specifies the name of group this backend address belongs to. By default, it belongs to the unnamed default group. The name of group is unique per pattern. \(dqgroup\-weight=\(dq parameter specifies the weight of the group. The higher weight gets more frequently selected by the load balancing algorithm. must be [1, 256] inclusive. The weight 8 has 4 times more weight than 2. must be the same for all addresses which share the same . If \(dqgroup\-weight\(dq is omitted in an address, but the other address which belongs to the same group specifies \(dqgroup\-weight\(dq, its weight is used. If no \(dqgroup\-weight\(dq is specified for all addresses, the weight of a group becomes 1. \(dqgroup\(dq and \(dqgroup\-weight\(dq are ignored if session affinity is enabled. .sp \(dqweight=\(dq parameter specifies the weight of the backend address inside a group which this address belongs to. The higher weight gets more frequently selected by the load balancing algorithm. must be [1, 256] inclusive. The weight 8 has 4 times more weight than weight 2. If this parameter is omitted, weight becomes 1. \(dqweight\(dq is ignored if session affinity is enabled. .sp If \(dqdnf\(dq parameter is specified, an incoming request is not forwarded to a backend and just consumed along with the request body (actually a backend server never be contacted). It is expected that the HTTP response is generated by mruby script (see \(dqmruby=\(dq parameter above). \(dqdnf\(dq is an abbreviation of \(dqdo not forward\(dq. .sp Since \(dq;\(dq and \(dq:\(dq are used as delimiter, must not contain these characters. In order to include \(dq:\(dq in , one has to specify \(dq%3A\(dq (which is percent\-encoded from of \(dq:\(dq) instead. Since \(dq;\(dq has special meaning in shell, the option value must be quoted. .sp Default: \fB127.0.0.1,80\fP .UNINDENT .INDENT 0.0 .TP .B \-f, \-\-frontend=(,|unix:)[[;]...] Set frontend host and port. If is \(aq*\(aq, it assumes all addresses including both IPv4 and IPv6. UNIX domain socket can be specified by prefixing path name with \(dqunix:\(dq (e.g., unix:/var/run/nghttpx.sock). This option can be used multiple times to listen to multiple addresses. .sp This option can take 0 or more parameters, which are described below. Note that \(dqapi\(dq and \(dqhealthmon\(dq parameters are mutually exclusive. .sp Optionally, TLS can be disabled by specifying \(dqno\-tls\(dq parameter. TLS is enabled by default. .sp If \(dqsni\-fwd\(dq parameter is used, when performing a match to select a backend server, SNI host name received from the client is used instead of the request host. See \fI\%\-\-backend\fP option about the pattern match. .sp To make this frontend as API endpoint, specify \(dqapi\(dq parameter. This is disabled by default. It is important to limit the access to the API frontend. Otherwise, someone may change the backend server, and break your services, or expose confidential information to the outside the world. .sp To make this frontend as health monitor endpoint, specify \(dqhealthmon\(dq parameter. This is disabled by default. Any requests which come through this address are replied with 200 HTTP status, without no body. .sp To accept PROXY protocol version 1 and 2 on frontend connection, specify \(dqproxyproto\(dq parameter. This is disabled by default. .sp To receive HTTP/3 (QUIC) traffic, specify \(dqquic\(dq parameter. It makes nghttpx listen on UDP port rather than TCP port. UNIX domain socket, \(dqapi\(dq, and \(dqhealthmon\(dq parameters cannot be used with \(dqquic\(dq parameter. .sp Default: \fB*,3000\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backlog= Set listen backlog size. .sp Default: \fB65536\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-address\-family=(auto|IPv4|IPv6) Specify address family of backend connections. If \(dqauto\(dq is given, both IPv4 and IPv6 are considered. If \(dqIPv4\(dq is given, only IPv4 address is considered. If \(dqIPv6\(dq is given, only IPv6 address is considered. .sp Default: \fBauto\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-http\-proxy\-uri= Specify proxy URI in the form \fI\%http:/\fP/[:@]:. If a proxy requires authentication, specify and . Note that they must be properly percent\-encoded. This proxy is used when the backend connection is HTTP/2. First, make a CONNECT request to the proxy and it connects to the backend on behalf of nghttpx. This forms tunnel. After that, nghttpx performs SSL/TLS handshake with the downstream through the tunnel. The timeouts when connecting and making CONNECT request can be specified by \fI\%\-\-backend\-read\-timeout\fP and \fI\%\-\-backend\-write\-timeout\fP options. .UNINDENT .SS Performance .INDENT 0.0 .TP .B \-n, \-\-workers= Set the number of worker threads. .sp Default: \fB1\fP .UNINDENT .INDENT 0.0 .TP .B \-\-single\-thread Run everything in one thread inside the worker process. This feature is provided for better debugging experience, or for the platforms which lack thread support. If threading is disabled, this option is always enabled. .UNINDENT .INDENT 0.0 .TP .B \-\-read\-rate= Set maximum average read rate on frontend connection. Setting 0 to this option means read rate is unlimited. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-read\-burst= Set maximum read burst size on frontend connection. Setting 0 to this option means read burst size is unlimited. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-write\-rate= Set maximum average write rate on frontend connection. Setting 0 to this option means write rate is unlimited. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-write\-burst= Set maximum write burst size on frontend connection. Setting 0 to this option means write burst size is unlimited. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-worker\-read\-rate= Set maximum average read rate on frontend connection per worker. Setting 0 to this option means read rate is unlimited. Not implemented yet. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-worker\-read\-burst= Set maximum read burst size on frontend connection per worker. Setting 0 to this option means read burst size is unlimited. Not implemented yet. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-worker\-write\-rate= Set maximum average write rate on frontend connection per worker. Setting 0 to this option means write rate is unlimited. Not implemented yet. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-worker\-write\-burst= Set maximum write burst size on frontend connection per worker. Setting 0 to this option means write burst size is unlimited. Not implemented yet. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-worker\-frontend\-connections= Set maximum number of simultaneous connections frontend accepts. Setting 0 means unlimited. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-connections\-per\-host= Set maximum number of backend concurrent connections (and/or streams in case of HTTP/2) per origin host. This option is meaningful when \fI\%\-\-http2\-proxy\fP option is used. The origin host is determined by authority portion of request URI (or :authority header field for HTTP/2). To limit the number of connections per frontend for default mode, use \fI\%\-\-backend\-connections\-per\-frontend\fP\&. .sp Default: \fB8\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-connections\-per\-frontend= Set maximum number of backend concurrent connections (and/or streams in case of HTTP/2) per frontend. This option is only used for default mode. 0 means unlimited. To limit the number of connections per host with \fI\%\-\-http2\-proxy\fP option, use \fI\%\-\-backend\-connections\-per\-host\fP\&. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-rlimit\-nofile= Set maximum number of open files (RLIMIT_NOFILE) to . If 0 is given, nghttpx does not set the limit. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-rlimit\-memlock= Set maximum number of bytes of memory that may be locked into RAM. If 0 is given, nghttpx does not set the limit. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-request\-buffer= Set buffer size used to store backend request. .sp Default: \fB16K\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-response\-buffer= Set buffer size used to store backend response. .sp Default: \fB128K\fP .UNINDENT .INDENT 0.0 .TP .B \-\-fastopen= Enables \(dqTCP Fast Open\(dq for the listening socket and limits the maximum length for the queue of connections that have not yet completed the three\-way handshake. If value is 0 then fast open is disabled. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-no\-kqueue Don\(aqt use kqueue. This option is only applicable for the platforms which have kqueue. For other platforms, this option will be simply ignored. .UNINDENT .SS Timeout .INDENT 0.0 .TP .B \-\-frontend\-http2\-idle\-timeout= Specify idle timeout for HTTP/2 frontend connection. If no active streams exist for this duration, connection is closed. .sp Default: \fB3m\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http3\-idle\-timeout= Specify idle timeout for HTTP/3 frontend connection. If no active streams exist for this duration, connection is closed. .sp Default: \fB3m\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-write\-timeout= Specify write timeout for all frontend connections. .sp Default: \fB30s\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-keep\-alive\-timeout= Specify keep\-alive timeout for frontend HTTP/1 connection. .sp Default: \fB1m\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-header\-timeout= Specify duration that the server waits for an HTTP request header fields to be received completely. On timeout, HTTP/1 and HTTP/2 connections are closed. For HTTP/3, the stream is shutdown, and the connection itself is left intact. .sp Default: \fB1m\fP .UNINDENT .INDENT 0.0 .TP .B \-\-stream\-read\-timeout= Specify read timeout for HTTP/2 streams. 0 means no timeout. .sp Default: \fB0\fP .UNINDENT .INDENT 0.0 .TP .B \-\-stream\-write\-timeout= Specify write timeout for HTTP/2 streams. 0 means no timeout. .sp Default: \fB1m\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-read\-timeout= Specify read timeout for backend connection. .sp Default: \fB1m\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-write\-timeout= Specify write timeout for backend connection. .sp Default: \fB30s\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-connect\-timeout= Specify timeout before establishing TCP connection to backend. .sp Default: \fB30s\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-keep\-alive\-timeout= Specify keep\-alive timeout for backend HTTP/1 connection. .sp Default: \fB2s\fP .UNINDENT .INDENT 0.0 .TP .B \-\-listener\-disable\-timeout= After accepting connection failed, connection listener is disabled for a given amount of time. Specifying 0 disables this feature. .sp Default: \fB30s\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http2\-setting\-timeout= Specify timeout before SETTINGS ACK is received from client. .sp Default: \fB10s\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-http2\-settings\-timeout= Specify timeout before SETTINGS ACK is received from backend server. .sp Default: \fB10s\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-max\-backoff= Specify maximum backoff interval. This is used when doing health check against offline backend (see \(dqfail\(dq parameter in \fI\%\-\-backend\fP option). It is also used to limit the maximum interval to temporarily disable backend when nghttpx failed to connect to it. These intervals are calculated using exponential backoff, and consecutive failed attempts increase the interval. This option caps its maximum value. .sp Default: \fB2m\fP .UNINDENT .SS SSL/TLS .INDENT 0.0 .TP .B \-\-ciphers= Set allowed cipher list for frontend connection. The format of the string is described in OpenSSL ciphers(1). This option sets cipher suites for TLSv1.2 or earlier. Use \fI\%\-\-tls13\-ciphers\fP for TLSv1.3. .sp Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls13\-ciphers= Set allowed cipher list for frontend connection. The format of the string is described in OpenSSL ciphers(1). This option sets cipher suites for TLSv1.3. Use \fI\%\-\-ciphers\fP for TLSv1.2 or earlier. .sp Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP .UNINDENT .INDENT 0.0 .TP .B \-\-client\-ciphers= Set allowed cipher list for backend connection. The format of the string is described in OpenSSL ciphers(1). This option sets cipher suites for TLSv1.2 or earlier. Use \fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.3. .sp Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls13\-client\-ciphers= Set allowed cipher list for backend connection. The format of the string is described in OpenSSL ciphers(1). This option sets cipher suites for TLSv1.3. Use \fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.2 or earlier. .sp Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP .UNINDENT .INDENT 0.0 .TP .B \-\-ecdh\-curves= Set supported curve list for frontend connections. is a colon separated list of curve NID or names in the preference order. The supported curves depend on the linked OpenSSL library. This function requires OpenSSL >= 1.0.2. .sp Default: \fBX25519:P\-256:P\-384:P\-521\fP .UNINDENT .INDENT 0.0 .TP .B \-k, \-\-insecure Don\(aqt verify backend server\(aqs certificate if TLS is enabled for backend connections. .UNINDENT .INDENT 0.0 .TP .B \-\-cacert= Set path to trusted CA certificate file. It is used in backend TLS connections to verify peer\(aqs certificate. It is also used to verify OCSP response from the script set by \fI\%\-\-fetch\-ocsp\-response\-file\fP\&. The file must be in PEM format. It can contain multiple certificates. If the linked OpenSSL is configured to load system wide certificates, they are loaded at startup regardless of this option. .UNINDENT .INDENT 0.0 .TP .B \-\-private\-key\-passwd\-file= Path to file that contains password for the server\(aqs private key. If none is given and the private key is password protected it\(aqll be requested interactively. .UNINDENT .INDENT 0.0 .TP .B \-\-subcert=:[[;]...] Specify additional certificate and private key file. nghttpx will choose certificates based on the hostname indicated by client using TLS SNI extension. If nghttpx is built with OpenSSL >= 1.0.2, the shared elliptic curves (e.g., P\-256) between client and server are also taken into consideration. This allows nghttpx to send ECDSA certificate to modern clients, while sending RSA based certificate to older clients. This option can be used multiple times. To make OCSP stapling work, must be absolute path. .sp Additional parameter can be specified in . The available is \(dqsct\-dir=\(dq. .sp \(dqsct\-dir=\(dq specifies the path to directory which contains *.sct files for TLS signed_certificate_timestamp extension (RFC 6962). This feature requires OpenSSL >= 1.0.2. See also \fI\%\-\-tls\-sct\-dir\fP option. .UNINDENT .INDENT 0.0 .TP .B \-\-dh\-param\-file= Path to file that contains DH parameters in PEM format. Without this option, DHE cipher suites are not available. .UNINDENT .INDENT 0.0 .TP .B \-\-alpn\-list= Comma delimited list of ALPN protocol identifier sorted in the order of preference. That means most desirable protocol comes first. The parameter must be delimited by a single comma only and any white spaces are treated as a part of protocol string. .sp Default: \fBh2,h2\-16,h2\-14,http/1.1\fP .UNINDENT .INDENT 0.0 .TP .B \-\-verify\-client Require and verify client certificate. .UNINDENT .INDENT 0.0 .TP .B \-\-verify\-client\-cacert= Path to file that contains CA certificates to verify client certificate. The file must be in PEM format. It can contain multiple certificates. .UNINDENT .INDENT 0.0 .TP .B \-\-verify\-client\-tolerate\-expired Accept expired client certificate. Operator should handle the expired client certificate by some means (e.g., mruby script). Otherwise, this option might cause a security risk. .UNINDENT .INDENT 0.0 .TP .B \-\-client\-private\-key\-file= Path to file that contains client private key used in backend client authentication. .UNINDENT .INDENT 0.0 .TP .B \-\-client\-cert\-file= Path to file that contains client certificate used in backend client authentication. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-min\-proto\-version= Specify minimum SSL/TLS protocol. The name matching is done in case\-insensitive manner. The versions between \fI\%\-\-tls\-min\-proto\-version\fP and \fI\%\-\-tls\-max\-proto\-version\fP are enabled. If the protocol list advertised by client does not overlap this range, you will receive the error message \(dqunknown protocol\(dq. If a protocol version lower than TLSv1.2 is specified, make sure that the compatible ciphers are included in \fI\%\-\-ciphers\fP option. The default cipher list only includes ciphers compatible with TLSv1.2 or above. The available versions are: TLSv1.3, TLSv1.2, TLSv1.1, and TLSv1.0 .sp Default: \fBTLSv1.2\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-max\-proto\-version= Specify maximum SSL/TLS protocol. The name matching is done in case\-insensitive manner. The versions between \fI\%\-\-tls\-min\-proto\-version\fP and \fI\%\-\-tls\-max\-proto\-version\fP are enabled. If the protocol list advertised by client does not overlap this range, you will receive the error message \(dqunknown protocol\(dq. The available versions are: TLSv1.3, TLSv1.2, TLSv1.1, and TLSv1.0 .sp Default: \fBTLSv1.3\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-ticket\-key\-file= Path to file that contains random data to construct TLS session ticket parameters. If aes\-128\-cbc is given in \fI\%\-\-tls\-ticket\-key\-cipher\fP, the file must contain exactly 48 bytes. If aes\-256\-cbc is given in \fI\%\-\-tls\-ticket\-key\-cipher\fP, the file must contain exactly 80 bytes. This options can be used repeatedly to specify multiple ticket parameters. If several files are given, only the first key is used to encrypt TLS session tickets. Other keys are accepted but server will issue new session ticket with first key. This allows session key rotation. Please note that key rotation does not occur automatically. User should rearrange files or change options values and restart nghttpx gracefully. If opening or reading given file fails, all loaded keys are discarded and it is treated as if none of this option is given. If this option is not given or an error occurred while opening or reading a file, key is generated every 1 hour internally and they are valid for 12 hours. This is recommended if ticket key sharing between nghttpx instances is not required. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-ticket\-key\-memcached=,[;tls] Specify address of memcached server to get TLS ticket keys for session resumption. This enables shared TLS ticket key between multiple nghttpx instances. nghttpx does not set TLS ticket key to memcached. The external ticket key generator is required. nghttpx just gets TLS ticket keys from memcached, and use them, possibly replacing current set of keys. It is up to extern TLS ticket key generator to rotate keys frequently. See \(dqTLS SESSION TICKET RESUMPTION\(dq section in manual page to know the data format in memcached entry. Optionally, memcached connection can be encrypted with TLS by specifying \(dqtls\(dq parameter. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-ticket\-key\-memcached\-address\-family=(auto|IPv4|IPv6) Specify address family of memcached connections to get TLS ticket keys. If \(dqauto\(dq is given, both IPv4 and IPv6 are considered. If \(dqIPv4\(dq is given, only IPv4 address is considered. If \(dqIPv6\(dq is given, only IPv6 address is considered. .sp Default: \fBauto\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-ticket\-key\-memcached\-interval= Set interval to get TLS ticket keys from memcached. .sp Default: \fB10m\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-ticket\-key\-memcached\-max\-retry= Set maximum number of consecutive retries before abandoning TLS ticket key retrieval. If this number is reached, the attempt is considered as failure, and \(dqfailure\(dq count is incremented by 1, which contributed to the value controlled \fI\%\-\-tls\-ticket\-key\-memcached\-max\-fail\fP option. .sp Default: \fB3\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-ticket\-key\-memcached\-max\-fail= Set maximum number of consecutive failure before disabling TLS ticket until next scheduled key retrieval. .sp Default: \fB2\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-ticket\-key\-cipher= Specify cipher to encrypt TLS session ticket. Specify either aes\-128\-cbc or aes\-256\-cbc. By default, aes\-128\-cbc is used. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-ticket\-key\-memcached\-cert\-file= Path to client certificate for memcached connections to get TLS ticket keys. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-ticket\-key\-memcached\-private\-key\-file= Path to client private key for memcached connections to get TLS ticket keys. .UNINDENT .INDENT 0.0 .TP .B \-\-fetch\-ocsp\-response\-file= Path to fetch\-ocsp\-response script file. It should be absolute path. .sp Default: \fB/usr/local/share/nghttp2/fetch\-ocsp\-response\fP .UNINDENT .INDENT 0.0 .TP .B \-\-ocsp\-update\-interval= Set interval to update OCSP response cache. .sp Default: \fB4h\fP .UNINDENT .INDENT 0.0 .TP .B \-\-ocsp\-startup Start accepting connections after initial attempts to get OCSP responses finish. It does not matter some of the attempts fail. This feature is useful if OCSP responses must be available before accepting connections. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-verify\-ocsp nghttpx does not verify OCSP response. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-ocsp Disable OCSP stapling. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-session\-cache\-memcached=,[;tls] Specify address of memcached server to store session cache. This enables shared session cache between multiple nghttpx instances. Optionally, memcached connection can be encrypted with TLS by specifying \(dqtls\(dq parameter. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-session\-cache\-memcached\-address\-family=(auto|IPv4|IPv6) Specify address family of memcached connections to store session cache. If \(dqauto\(dq is given, both IPv4 and IPv6 are considered. If \(dqIPv4\(dq is given, only IPv4 address is considered. If \(dqIPv6\(dq is given, only IPv6 address is considered. .sp Default: \fBauto\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-session\-cache\-memcached\-cert\-file= Path to client certificate for memcached connections to store session cache. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-session\-cache\-memcached\-private\-key\-file= Path to client private key for memcached connections to store session cache. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-dyn\-rec\-warmup\-threshold= Specify the threshold size for TLS dynamic record size behaviour. During a TLS session, after the threshold number of bytes have been written, the TLS record size will be increased to the maximum allowed (16K). The max record size will continue to be used on the active TLS session. After \fI\%\-\-tls\-dyn\-rec\-idle\-timeout\fP has elapsed, the record size is reduced to 1300 bytes. Specify 0 to always use the maximum record size, regardless of idle period. This behaviour applies to all TLS based frontends, and TLS HTTP/2 backends. .sp Default: \fB1M\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-dyn\-rec\-idle\-timeout= Specify TLS dynamic record size behaviour timeout. See \fI\%\-\-tls\-dyn\-rec\-warmup\-threshold\fP for more information. This behaviour applies to all TLS based frontends, and TLS HTTP/2 backends. .sp Default: \fB1s\fP .UNINDENT .INDENT 0.0 .TP .B \-\-no\-http2\-cipher\-block\-list Allow block listed cipher suite on frontend HTTP/2 connection. See \fI\%https://tools.ietf.org/html/rfc7540#appendix\-A\fP for the complete HTTP/2 cipher suites block list. .UNINDENT .INDENT 0.0 .TP .B \-\-client\-no\-http2\-cipher\-block\-list Allow block listed cipher suite on backend HTTP/2 connection. See \fI\%https://tools.ietf.org/html/rfc7540#appendix\-A\fP for the complete HTTP/2 cipher suites block list. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-sct\-dir= Specifies the directory where *.sct files exist. All *.sct files in are read, and sent as extension_data of TLS signed_certificate_timestamp (RFC 6962) to client. These *.sct files are for the certificate specified in positional command\-line argument , or certificate option in configuration file. For additional certificates, use \fI\%\-\-subcert\fP option. This option requires OpenSSL >= 1.0.2. .UNINDENT .INDENT 0.0 .TP .B \-\-psk\-secrets= Read list of PSK identity and secrets from . This is used for frontend connection. The each line of input file is formatted as :, where is PSK identity, and is secret in hex. An empty line, and line which starts with \(aq#\(aq are skipped. The default enabled cipher list might not contain any PSK cipher suite. In that case, desired PSK cipher suites must be enabled using \fI\%\-\-ciphers\fP option. The desired PSK cipher suite may be block listed by HTTP/2. To use those cipher suites with HTTP/2, consider to use \fI\%\-\-no\-http2\-cipher\-block\-list\fP option. But be aware its implications. .UNINDENT .INDENT 0.0 .TP .B \-\-client\-psk\-secrets= Read PSK identity and secrets from . This is used for backend connection. The each line of input file is formatted as :, where is PSK identity, and is secret in hex. An empty line, and line which starts with \(aq#\(aq are skipped. The first identity and secret pair encountered is used. The default enabled cipher list might not contain any PSK cipher suite. In that case, desired PSK cipher suites must be enabled using \fI\%\-\-client\-ciphers\fP option. The desired PSK cipher suite may be block listed by HTTP/2. To use those cipher suites with HTTP/2, consider to use \fI\%\-\-client\-no\-http2\-cipher\-block\-list\fP option. But be aware its implications. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-no\-postpone\-early\-data By default, except for QUIC connections, nghttpx postpones forwarding HTTP requests sent in early data, including those sent in partially in it, until TLS handshake finishes. If all backend server recognizes \(dqEarly\-Data\(dq header field, using this option makes nghttpx not postpone forwarding request and get full potential of 0\-RTT data. .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-max\-early\-data= Sets the maximum amount of 0\-RTT data that server accepts. .sp Default: \fB16K\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls\-ktls Enable ktls. For server, ktls is enable if \fI\%\-\-tls\-session\-cache\-memcached\fP is not configured. .UNINDENT .SS HTTP/2 .INDENT 0.0 .TP .B \-c, \-\-frontend\-http2\-max\-concurrent\-streams= Set the maximum number of the concurrent streams in one frontend HTTP/2 session. .sp Default: \fB100\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-http2\-max\-concurrent\-streams= Set the maximum number of the concurrent streams in one backend HTTP/2 session. This sets maximum number of concurrent opened pushed streams. The maximum number of concurrent requests are set by a remote server. .sp Default: \fB100\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http2\-window\-size= Sets the per\-stream initial window size of HTTP/2 frontend connection. .sp Default: \fB65535\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http2\-connection\-window\-size= Sets the per\-connection window size of HTTP/2 frontend connection. .sp Default: \fB65535\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-http2\-window\-size= Sets the initial window size of HTTP/2 backend connection. .sp Default: \fB65535\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-http2\-connection\-window\-size= Sets the per\-connection window size of HTTP/2 backend connection. .sp Default: \fB2147483647\fP .UNINDENT .INDENT 0.0 .TP .B \-\-http2\-no\-cookie\-crumbling Don\(aqt crumble cookie header field. .UNINDENT .INDENT 0.0 .TP .B \-\-padding= Add at most bytes to a HTTP/2 frame payload as padding. Specify 0 to disable padding. This option is meant for debugging purpose and not intended to enhance protocol security. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-server\-push Disable HTTP/2 server push. Server push is supported by default mode and HTTP/2 frontend via Link header field. It is also supported if both frontend and backend are HTTP/2 in default mode. In this case, server push from backend session is relayed to frontend, and server push via Link header field is also supported. .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http2\-optimize\-write\-buffer\-size (Experimental) Enable write buffer size optimization in frontend HTTP/2 TLS connection. This optimization aims to reduce write buffer size so that it only contains bytes which can send immediately. This makes server more responsive to prioritized HTTP/2 stream because the buffering of lower priority stream is reduced. This option is only effective on recent Linux platform. .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http2\-optimize\-window\-size (Experimental) Automatically tune connection level window size of frontend HTTP/2 TLS connection. If this feature is enabled, connection window size starts with the default window size, 65535 bytes. nghttpx automatically adjusts connection window size based on TCP receiving window size. The maximum window size is capped by the value specified by \fI\%\-\-frontend\-http2\-connection\-window\-size\fP\&. Since the stream is subject to stream level window size, it should be adjusted using \fI\%\-\-frontend\-http2\-window\-size\fP option as well. This option is only effective on recent Linux platform. .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http2\-encoder\-dynamic\-table\-size= Specify the maximum dynamic table size of HPACK encoder in the frontend HTTP/2 connection. The decoder (client) specifies the maximum dynamic table size it accepts. Then the negotiated dynamic table size is the minimum of this option value and the value which client specified. .sp Default: \fB4K\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http2\-decoder\-dynamic\-table\-size= Specify the maximum dynamic table size of HPACK decoder in the frontend HTTP/2 connection. .sp Default: \fB4K\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-http2\-encoder\-dynamic\-table\-size= Specify the maximum dynamic table size of HPACK encoder in the backend HTTP/2 connection. The decoder (backend) specifies the maximum dynamic table size it accepts. Then the negotiated dynamic table size is the minimum of this option value and the value which backend specified. .sp Default: \fB4K\fP .UNINDENT .INDENT 0.0 .TP .B \-\-backend\-http2\-decoder\-dynamic\-table\-size= Specify the maximum dynamic table size of HPACK decoder in the backend HTTP/2 connection. .sp Default: \fB4K\fP .UNINDENT .SS Mode .INDENT 0.0 .TP .B (default mode) Accept HTTP/2, and HTTP/1.1 over SSL/TLS. \(dqno\-tls\(dq parameter is used in \fI\%\-\-frontend\fP option, accept HTTP/2 and HTTP/1.1 over cleartext TCP. The incoming HTTP/1.1 connection can be upgraded to HTTP/2 through HTTP Upgrade. .UNINDENT .INDENT 0.0 .TP .B \-s, \-\-http2\-proxy Like default mode, but enable forward proxy. This is so called HTTP/2 proxy mode. .UNINDENT .SS Logging .INDENT 0.0 .TP .B \-L, \-\-log\-level= Set the severity level of log output. must be one of INFO, NOTICE, WARN, ERROR and FATAL. .sp Default: \fBNOTICE\fP .UNINDENT .INDENT 0.0 .TP .B \-\-accesslog\-file= Set path to write access log. To reopen file, send USR1 signal to nghttpx. .UNINDENT .INDENT 0.0 .TP .B \-\-accesslog\-syslog Send access log to syslog. If this option is used, \fI\%\-\-accesslog\-file\fP option is ignored. .UNINDENT .INDENT 0.0 .TP .B \-\-accesslog\-format= Specify format string for access log. The default format is combined format. The following variables are available: .INDENT 7.0 .IP \(bu 2 $remote_addr: client IP address. .IP \(bu 2 $time_local: local time in Common Log format. .IP \(bu 2 $time_iso8601: local time in ISO 8601 format. .IP \(bu 2 $request: HTTP request line. .IP \(bu 2 $status: HTTP response status code. .IP \(bu 2 $body_bytes_sent: the number of bytes sent to client as response body. .IP \(bu 2 $http_: value of HTTP request header where \(aq_\(aq in is replaced with \(aq\-\(aq. .IP \(bu 2 $remote_port: client port. .IP \(bu 2 $server_port: server port. .IP \(bu 2 $request_time: request processing time in seconds with milliseconds resolution. .IP \(bu 2 $pid: PID of the running process. .IP \(bu 2 $alpn: ALPN identifier of the protocol which generates the response. For HTTP/1, ALPN is always http/1.1, regardless of minor version. .IP \(bu 2 $tls_cipher: cipher used for SSL/TLS connection. .IP \(bu 2 $tls_client_fingerprint_sha256: SHA\-256 fingerprint of client certificate. .IP \(bu 2 $tls_client_fingerprint_sha1: SHA\-1 fingerprint of client certificate. .IP \(bu 2 $tls_client_subject_name: subject name in client certificate. .IP \(bu 2 $tls_client_issuer_name: issuer name in client certificate. .IP \(bu 2 $tls_client_serial: serial number in client certificate. .IP \(bu 2 $tls_protocol: protocol for SSL/TLS connection. .IP \(bu 2 $tls_session_id: session ID for SSL/TLS connection. .IP \(bu 2 $tls_session_reused: \(dqr\(dq if SSL/TLS session was reused. Otherwise, \(dq.\(dq .IP \(bu 2 $tls_sni: SNI server name for SSL/TLS connection. .IP \(bu 2 $backend_host: backend host used to fulfill the request. \(dq\-\(dq if backend host is not available. .IP \(bu 2 $backend_port: backend port used to fulfill the request. \(dq\-\(dq if backend host is not available. .IP \(bu 2 $method: HTTP method .IP \(bu 2 $path: Request path including query. For CONNECT request, authority is recorded. .IP \(bu 2 $path_without_query: $path up to the first \(aq?\(aq character. For CONNECT request, authority is recorded. .IP \(bu 2 $protocol_version: HTTP version (e.g., HTTP/1.1, HTTP/2) .UNINDENT .sp The variable can be enclosed by \(dq{\(dq and \(dq}\(dq for disambiguation (e.g., ${remote_addr}). .sp Default: \fB$remote_addr \- \- [$time_local] \(dq$request\(dq $status $body_bytes_sent \(dq$http_referer\(dq \(dq$http_user_agent\(dq\fP .UNINDENT .INDENT 0.0 .TP .B \-\-accesslog\-write\-early Write access log when response header fields are received from backend rather than when request transaction finishes. .UNINDENT .INDENT 0.0 .TP .B \-\-errorlog\-file= Set path to write error log. To reopen file, send USR1 signal to nghttpx. stderr will be redirected to the error log file unless \fI\%\-\-errorlog\-syslog\fP is used. .sp Default: \fB/dev/stderr\fP .UNINDENT .INDENT 0.0 .TP .B \-\-errorlog\-syslog Send error log to syslog. If this option is used, \fI\%\-\-errorlog\-file\fP option is ignored. .UNINDENT .INDENT 0.0 .TP .B \-\-syslog\-facility= Set syslog facility to . .sp Default: \fBdaemon\fP .UNINDENT .SS HTTP .INDENT 0.0 .TP .B \-\-add\-x\-forwarded\-for Append X\-Forwarded\-For header field to the downstream request. .UNINDENT .INDENT 0.0 .TP .B \-\-strip\-incoming\-x\-forwarded\-for Strip X\-Forwarded\-For header field from inbound client requests. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-add\-x\-forwarded\-proto Don\(aqt append additional X\-Forwarded\-Proto header field to the backend request. If inbound client sets X\-Forwarded\-Proto, and \fI\%\-\-no\-strip\-incoming\-x\-forwarded\-proto\fP option is used, they are passed to the backend. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-strip\-incoming\-x\-forwarded\-proto Don\(aqt strip X\-Forwarded\-Proto header field from inbound client requests. .UNINDENT .INDENT 0.0 .TP .B \-\-add\-forwarded= Append RFC 7239 Forwarded header field with parameters specified in comma delimited list . The supported parameters are \(dqby\(dq, \(dqfor\(dq, \(dqhost\(dq, and \(dqproto\(dq. By default, the value of \(dqby\(dq and \(dqfor\(dq parameters are obfuscated string. See \fI\%\-\-forwarded\-by\fP and \fI\%\-\-forwarded\-for\fP options respectively. Note that nghttpx does not translate non\-standard X\-Forwarded\-* header fields into Forwarded header field, and vice versa. .UNINDENT .INDENT 0.0 .TP .B \-\-strip\-incoming\-forwarded Strip Forwarded header field from inbound client requests. .UNINDENT .INDENT 0.0 .TP .B \-\-forwarded\-by=(obfuscated|ip|) Specify the parameter value sent out with \(dqby\(dq parameter of Forwarded header field. If \(dqobfuscated\(dq is given, the string is randomly generated at startup. If \(dqip\(dq is given, the interface address of the connection, including port number, is sent with \(dqby\(dq parameter. In case of UNIX domain socket, \(dqlocalhost\(dq is used instead of address and port. User can also specify the static obfuscated string. The limitation is that it must start with \(dq_\(dq, and only consists of character set [A\-Za\-z0\-9._\-], as described in RFC 7239. .sp Default: \fBobfuscated\fP .UNINDENT .INDENT 0.0 .TP .B \-\-forwarded\-for=(obfuscated|ip) Specify the parameter value sent out with \(dqfor\(dq parameter of Forwarded header field. If \(dqobfuscated\(dq is given, the string is randomly generated for each client connection. If \(dqip\(dq is given, the remote client address of the connection, without port number, is sent with \(dqfor\(dq parameter. In case of UNIX domain socket, \(dqlocalhost\(dq is used instead of address. .sp Default: \fBobfuscated\fP .UNINDENT .INDENT 0.0 .TP .B \-\-no\-via Don\(aqt append to Via header field. If Via header field is received, it is left unaltered. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-strip\-incoming\-early\-data Don\(aqt strip Early\-Data header field from inbound client requests. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-location\-rewrite Don\(aqt rewrite location header field in default mode. When \fI\%\-\-http2\-proxy\fP is used, location header field will not be altered regardless of this option. .UNINDENT .INDENT 0.0 .TP .B \-\-host\-rewrite Rewrite host and :authority header fields in default mode. When \fI\%\-\-http2\-proxy\fP is used, these headers will not be altered regardless of this option. .UNINDENT .INDENT 0.0 .TP .B \-\-altsvc= Specify protocol ID, port, host and origin of alternative service. , and are optional. Empty and are allowed and they are treated as nothing is specified. They are advertised in alt\-svc header field only in HTTP/1.1 frontend. This option can be used multiple times to specify multiple alternative services. Example: \fI\%\-\-altsvc\fP=\(dqh2,443,,,ma=3600; persist=1\(dq .UNINDENT .INDENT 0.0 .TP .B \-\-http2\-altsvc= Just like \fI\%\-\-altsvc\fP option, but this altsvc is only sent in HTTP/2 frontend. .UNINDENT .INDENT 0.0 .TP .B \-\-add\-request\-header=
Specify additional header field to add to request header set. The field name must be lowercase. This option just appends header field and won\(aqt replace anything already set. This option can be used several times to specify multiple header fields. Example: \fI\%\-\-add\-request\-header\fP=\(dqfoo: bar\(dq .UNINDENT .INDENT 0.0 .TP .B \-\-add\-response\-header=
Specify additional header field to add to response header set. The field name must be lowercase. This option just appends header field and won\(aqt replace anything already set. This option can be used several times to specify multiple header fields. Example: \fI\%\-\-add\-response\-header\fP=\(dqfoo: bar\(dq .UNINDENT .INDENT 0.0 .TP .B \-\-request\-header\-field\-buffer= Set maximum buffer size for incoming HTTP request header field list. This is the sum of header name and value in bytes. If trailer fields exist, they are counted towards this number. .sp Default: \fB64K\fP .UNINDENT .INDENT 0.0 .TP .B \-\-max\-request\-header\-fields= Set maximum number of incoming HTTP request header fields. If trailer fields exist, they are counted towards this number. .sp Default: \fB100\fP .UNINDENT .INDENT 0.0 .TP .B \-\-response\-header\-field\-buffer= Set maximum buffer size for incoming HTTP response header field list. This is the sum of header name and value in bytes. If trailer fields exist, they are counted towards this number. .sp Default: \fB64K\fP .UNINDENT .INDENT 0.0 .TP .B \-\-max\-response\-header\-fields= Set maximum number of incoming HTTP response header fields. If trailer fields exist, they are counted towards this number. .sp Default: \fB500\fP .UNINDENT .INDENT 0.0 .TP .B \-\-error\-page=(|*)= Set file path to custom error page served when nghttpx originally generates HTTP error status code . must be greater than or equal to 400, and at most 599. If \(dq*\(dq is used instead of , it matches all HTTP status code. If error status code comes from backend server, the custom error pages are not used. .UNINDENT .INDENT 0.0 .TP .B \-\-server\-name= Change server response header field value to . .sp Default: \fBnghttpx\fP .UNINDENT .INDENT 0.0 .TP .B \-\-no\-server\-rewrite Don\(aqt rewrite server header field in default mode. When \fI\%\-\-http2\-proxy\fP is used, these headers will not be altered regardless of this option. .UNINDENT .INDENT 0.0 .TP .B \-\-redirect\-https\-port= Specify the port number which appears in Location header field when redirect to HTTPS URI is made due to \(dqredirect\-if\-not\-tls\(dq parameter in \fI\%\-\-backend\fP option. .sp Default: \fB443\fP .UNINDENT .INDENT 0.0 .TP .B \-\-require\-http\-scheme Always require http or https scheme in HTTP request. It also requires that https scheme must be used for an encrypted connection. Otherwise, http scheme must be used. This option is recommended for a server deployment which directly faces clients and the services it provides only require http or https scheme. .UNINDENT .SS API .INDENT 0.0 .TP .B \-\-api\-max\-request\-body= Set the maximum size of request body for API request. .sp Default: \fB32M\fP .UNINDENT .SS DNS .INDENT 0.0 .TP .B \-\-dns\-cache\-timeout= Set duration that cached DNS results remain valid. Note that nghttpx caches the unsuccessful results as well. .sp Default: \fB10s\fP .UNINDENT .INDENT 0.0 .TP .B \-\-dns\-lookup\-timeout= Set timeout that DNS server is given to respond to the initial DNS query. For the 2nd and later queries, server is given time based on this timeout, and it is scaled linearly. .sp Default: \fB5s\fP .UNINDENT .INDENT 0.0 .TP .B \-\-dns\-max\-try= Set the number of DNS query before nghttpx gives up name lookup. .sp Default: \fB2\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-max\-requests= The number of requests that single frontend connection can process. For HTTP/2, this is the number of streams in one HTTP/2 connection. For HTTP/1, this is the number of keep alive requests. This is hint to nghttpx, and it may allow additional few requests. The default value is unlimited. .UNINDENT .SS Debug .INDENT 0.0 .TP .B \-\-frontend\-http2\-dump\-request\-header= Dumps request headers received by HTTP/2 frontend to the file denoted in . The output is done in HTTP/1 header field format and each header block is followed by an empty line. This option is not thread safe and MUST NOT be used with option \fI\%\-n\fP, where >= 2. .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http2\-dump\-response\-header= Dumps response headers sent from HTTP/2 frontend to the file denoted in . The output is done in HTTP/1 header field format and each header block is followed by an empty line. This option is not thread safe and MUST NOT be used with option \fI\%\-n\fP, where >= 2. .UNINDENT .INDENT 0.0 .TP .B \-o, \-\-frontend\-frame\-debug Print HTTP/2 frames in frontend to stderr. This option is not thread safe and MUST NOT be used with option \fI\%\-n\fP=N, where N >= 2. .UNINDENT .SS Process .INDENT 0.0 .TP .B \-D, \-\-daemon Run in a background. If \fI\%\-D\fP is used, the current working directory is changed to \(aq\fI/\fP\(aq. .UNINDENT .INDENT 0.0 .TP .B \-\-pid\-file= Set path to save PID of this program. .UNINDENT .INDENT 0.0 .TP .B \-\-user= Run this program as . This option is intended to be used to drop root privileges. .UNINDENT .INDENT 0.0 .TP .B \-\-single\-process Run this program in a single process mode for debugging purpose. Without this option, nghttpx creates at least 2 processes: main and worker processes. If this option is used, main and worker are unified into a single process. nghttpx still spawns additional process if neverbleed is used. In the single process mode, the signal handling feature is disabled. .UNINDENT .INDENT 0.0 .TP .B \-\-max\-worker\-processes= The maximum number of worker processes. nghttpx spawns new worker process when it reloads its configuration. The previous worker process enters graceful termination period and will terminate when it finishes handling the existing connections. However, if reloading configurations happen very frequently, the worker processes might be piled up if they take a bit long time to finish the existing connections. With this option, if the number of worker processes exceeds the given value, the oldest worker process is terminated immediately. Specifying 0 means no limit and it is the default behaviour. .UNINDENT .INDENT 0.0 .TP .B \-\-worker\-process\-grace\-shutdown\-period= Maximum period for a worker process to terminate gracefully. When a worker process enters in graceful shutdown period (e.g., when nghttpx reloads its configuration) and it does not finish handling the existing connections in the given period of time, it is immediately terminated. Specifying 0 means no limit and it is the default behaviour. .UNINDENT .SS Scripting .INDENT 0.0 .TP .B \-\-mruby\-file= Set mruby script file .UNINDENT .INDENT 0.0 .TP .B \-\-ignore\-per\-pattern\-mruby\-error Ignore mruby compile error for per\-pattern mruby script file. If error occurred, it is treated as if no mruby file were specified for the pattern. .UNINDENT .SS HTTP/3 and QUIC .INDENT 0.0 .TP .B \-\-frontend\-quic\-idle\-timeout= Specify an idle timeout for QUIC connection. .sp Default: \fB30s\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-quic\-debug\-log Output QUIC debug log to \fI/dev/stderr.\fP .UNINDENT .INDENT 0.0 .TP .B \-\-quic\-bpf\-program\-file= Specify a path to eBPF program file reuseport_kern.o to direct an incoming QUIC UDP datagram to a correct socket. .sp Default: \fB/usr/local/lib/nghttp2/reuseport_kern.o\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-quic\-early\-data Enable early data on frontend QUIC connections. nghttpx sends \(dqEarly\-Data\(dq header field to a backend server if a request is received in early data and handshake has not finished. All backend servers should deal with possibly replayed requests. .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-quic\-qlog\-dir= Specify a directory where a qlog file is written for frontend QUIC connections. A qlog file is created per each QUIC connection. The file name is ISO8601 basic format, followed by \(dq\-\(dq, server Source Connection ID and \(dq.sqlog\(dq. .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-quic\-require\-token Require an address validation token for a frontend QUIC connection. Server sends a token in Retry packet or NEW_TOKEN frame in the previous connection. .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-quic\-congestion\-controller= Specify a congestion controller algorithm for a frontend QUIC connection. should be either \(dqcubic\(dq or \(dqbbr\(dq. .sp Default: \fBcubic\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-quic\-secret\-file= Path to file that contains secure random data to be used as QUIC keying materials. It is used to derive keys for encrypting tokens and Connection IDs. It is not used to encrypt QUIC packets. Each line of this file must contain exactly 136 bytes hex\-encoded string (when decoded the byte string is 68 bytes long). The first 3 bits of decoded byte string are used to identify the keying material. An empty line or a line which starts \(aq#\(aq is ignored. The file can contain more than one keying materials. Because the identifier is 3 bits, at most 8 keying materials are read and the remaining data is discarded. The first keying material in the file is primarily used for encryption and decryption for new connection. The other ones are used to decrypt data for the existing connections. Specifying multiple keying materials enables key rotation. Please note that key rotation does not occur automatically. User should update files or change options values and restart nghttpx gracefully. If opening or reading given file fails, all loaded keying materials are discarded and it is treated as if none of this option is given. If this option is not given or an error occurred while opening or reading a file, a keying material is generated internally on startup and reload. .UNINDENT .INDENT 0.0 .TP .B \-\-quic\-server\-id= Specify server ID encoded in Connection ID to identify this particular server instance. Connection ID is encrypted and this part is not visible in public. It must be 4 bytes long and must be encoded in hex string (which is 8 bytes long). If this option is omitted, a random server ID is generated on startup and configuration reload. .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-quic\-initial\-rtt= Specify the initial RTT of the frontend QUIC connection. .sp Default: \fB333ms\fP .UNINDENT .INDENT 0.0 .TP .B \-\-no\-quic\-bpf Disable eBPF. .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http3\-window\-size= Sets the per\-stream initial window size of HTTP/3 frontend connection. .sp Default: \fB256K\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http3\-connection\-window\-size= Sets the per\-connection window size of HTTP/3 frontend connection. .sp Default: \fB1M\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http3\-max\-window\-size= Sets the maximum per\-stream window size of HTTP/3 frontend connection. The window size is adjusted based on the receiving rate of stream data. The initial value is the value specified by \fI\%\-\-frontend\-http3\-window\-size\fP and the window size grows up to bytes. .sp Default: \fB6M\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http3\-max\-connection\-window\-size= Sets the maximum per\-connection window size of HTTP/3 frontend connection. The window size is adjusted based on the receiving rate of stream data. The initial value is the value specified by \fI\%\-\-frontend\-http3\-connection\-window\-size\fP and the window size grows up to bytes. .sp Default: \fB8M\fP .UNINDENT .INDENT 0.0 .TP .B \-\-frontend\-http3\-max\-concurrent\-streams= Set the maximum number of the concurrent streams in one frontend HTTP/3 connection. .sp Default: \fB100\fP .UNINDENT .SS Misc .INDENT 0.0 .TP .B \-\-conf= Load configuration from . Please note that nghttpx always tries to read the default configuration file if \fI\%\-\-conf\fP is not given. .sp Default: \fB/etc/nghttpx/nghttpx.conf\fP .UNINDENT .INDENT 0.0 .TP .B \-\-include= Load additional configurations from . File is read when configuration parser encountered this option. This option can be used multiple times, or even recursively. .UNINDENT .INDENT 0.0 .TP .B \-v, \-\-version Print version and exit. .UNINDENT .INDENT 0.0 .TP .B \-h, \-\-help Print this help and exit. .UNINDENT .sp The argument is an integer and an optional unit (e.g., 10K is 10 * 1024). Units are K, M and G (powers of 1024). .sp The argument is an integer and an optional unit (e.g., 1s is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms (hours, minutes, seconds and milliseconds, respectively). If a unit is omitted, a second is used as unit. .SH FILES .INDENT 0.0 .TP .B \fI/etc/nghttpx/nghttpx.conf\fP The default configuration file path nghttpx searches at startup. The configuration file path can be changed using \fI\%\-\-conf\fP option. .sp Those lines which are staring \fB#\fP are treated as comment. .sp The option name in the configuration file is the long command\-line option name with leading \fB\-\-\fP stripped (e.g., \fBfrontend\fP). Put \fB=\fP between option name and value. Don\(aqt put extra leading or trailing spaces. .sp When specifying arguments including characters which have special meaning to a shell, we usually use quotes so that shell does not interpret them. When writing this configuration file, quotes for this purpose must not be used. For example, specify additional request header field, do this: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C add\-request\-header=foo: bar .ft P .fi .UNINDENT .UNINDENT .sp instead of: .INDENT 7.0 .INDENT 3.5 .sp .nf .ft C add\-request\-header=\(dqfoo: bar\(dq .ft P .fi .UNINDENT .UNINDENT .sp The options which do not take argument in the command\-line \fItake\fP argument in the configuration file. Specify \fByes\fP as an argument (e.g., \fBhttp2\-proxy=yes\fP). If other string is given, it is ignored. .sp To specify private key and certificate file which are given as positional arguments in command\-line, use \fBprivate\-key\-file\fP and \fBcertificate\-file\fP\&. .sp \fI\%\-\-conf\fP option cannot be used in the configuration file and will be ignored if specified. .TP .B Error log Error log is written to stderr by default. It can be configured using \fI\%\-\-errorlog\-file\fP\&. The format of log message is as follows: .sp (:) .INDENT 7.0 .TP .B It is a combination of date and time when the log is written. It is in ISO 8601 format. .TP .B It is a main process ID. .TP .B It is a process ID which writes this log. .TP .B It is a thread ID which writes this log. It would be unique within . .TP .B and They are source file name, and line number which produce this log. .TP .B It is a log message body. .UNINDENT .UNINDENT .SH SIGNALS .INDENT 0.0 .TP .B SIGQUIT Shutdown gracefully. First accept pending connections and stop accepting connection. After all connections are handled, nghttpx exits. .TP .B SIGHUP Reload configuration file given in \fI\%\-\-conf\fP\&. .TP .B SIGUSR1 Reopen log files. .UNINDENT .sp SIGUSR2 .INDENT 0.0 .INDENT 3.5 Fork and execute nghttpx. It will execute the binary in the same path with same command\-line arguments and environment variables. As of nghttpx version 1.20.0, the new main process sends SIGQUIT to the original main process when it is ready to serve requests. For the earlier versions of nghttpx, user has to send SIGQUIT to the original main process. .sp The difference between SIGUSR2 (+ SIGQUIT) and SIGHUP is that former is usually used to execute new binary, and the main process is newly spawned. On the other hand, the latter just reloads configuration file, and the same main process continues to exist. .UNINDENT .UNINDENT .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 nghttpx consists of multiple processes: one process for processing these signals, and another one for processing requests. The former spawns the latter. The former is called main process, and the latter is called worker process. If neverbleed is enabled, the worker process spawns neverbleed daemon process which does RSA key processing. The above signal must be sent to the main process. If the other processes received one of them, it is ignored. This behaviour of these processes may change in the future release. In other words, in the future release, the processes other than main process may terminate upon the reception of these signals. Therefore these signals should not be sent to the processes other than main process. .UNINDENT .UNINDENT .SH SERVER PUSH .sp nghttpx supports HTTP/2 server push in default mode with Link header field. nghttpx looks for Link header field (\fI\%RFC 5988\fP) in response headers from backend server and extracts URI\-reference with parameter \fBrel=preload\fP (see \fI\%preload\fP) and pushes those URIs to the frontend client. Here is a sample Link header field to initiate server push: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C Link: ; rel=preload Link: ; rel=preload .ft P .fi .UNINDENT .UNINDENT .sp Currently, the following restriction is applied for server push: .INDENT 0.0 .IP 1. 3 The associated stream must have method \(dqGET\(dq or \(dqPOST\(dq. The associated stream\(aqs status code must be 200. .UNINDENT .sp This limitation may be loosened in the future release. .sp nghttpx also supports server push if both frontend and backend are HTTP/2 in default mode. In this case, in addition to server push via Link header field, server push from backend is forwarded to frontend HTTP/2 session. .sp HTTP/2 server push will be disabled if \fI\%\-\-http2\-proxy\fP is used. .SH UNIX DOMAIN SOCKET .sp nghttpx supports UNIX domain socket with a filename for both frontend and backend connections. .sp Please note that current nghttpx implementation does not delete a socket with a filename. And on start up, if nghttpx detects that the specified socket already exists in the file system, nghttpx first deletes it. However, if SIGUSR2 is used to execute new binary and both old and new configurations use same filename, new binary does not delete the socket and continues to use it. .SH OCSP STAPLING .sp OCSP query is done using external Python script \fBfetch\-ocsp\-response\fP, which has been originally developed in Perl as part of h2o project (\fI\%https://github.com/h2o/h2o\fP), and was translated into Python. .sp The script file is usually installed under \fB$(prefix)/share/nghttp2/\fP directory. The actual path to script can be customized using \fI\%\-\-fetch\-ocsp\-response\-file\fP option. .sp If OCSP query is failed, previous OCSP response, if any, is continued to be used. .sp \fI\%\-\-fetch\-ocsp\-response\-file\fP option provides wide range of possibility to manage OCSP response. It can take an arbitrary script or executable. The requirement is that it supports the command\-line interface of \fBfetch\-ocsp\-response\fP script, and it must return a valid DER encoded OCSP response on success. It must return exit code 0 on success, and 75 for temporary error, and the other error code for generic failure. For large cluster of servers, it is not efficient for each server to perform OCSP query using \fBfetch\-ocsp\-response\fP\&. Instead, you can retrieve OCSP response in some way, and store it in a disk or a shared database. Then specify a program in \fI\%\-\-fetch\-ocsp\-response\-file\fP to fetch it from those stores. This could provide a way to share the OCSP response between fleet of servers, and also any OCSP query strategy can be applied which may be beyond the ability of nghttpx itself or \fBfetch\-ocsp\-response\fP script. .SH TLS SESSION RESUMPTION .sp nghttpx supports TLS session resumption through both session ID and session ticket. .SS SESSION ID RESUMPTION .sp By default, session ID is shared by all worker threads. .sp If \fI\%\-\-tls\-session\-cache\-memcached\fP is given, nghttpx will insert serialized session data to memcached with \fBnghttpx:tls\-session\-cache:\fP + lowercase hex string of session ID as a memcached entry key, with expiry time 12 hours. Session timeout is set to 12 hours. .sp By default, connections to memcached server are not encrypted. To enable encryption, use \fBtls\fP keyword in \fI\%\-\-tls\-session\-cache\-memcached\fP option. .SS TLS SESSION TICKET RESUMPTION .sp By default, session ticket is shared by all worker threads. The automatic key rotation is also enabled by default. Every an hour, new encryption key is generated, and previous encryption key becomes decryption only key. We set session timeout to 12 hours, and thus we keep at most 12 keys. .sp If \fI\%\-\-tls\-ticket\-key\-memcached\fP is given, encryption keys are retrieved from memcached. nghttpx just reads keys from memcached; one has to deploy key generator program to update keys frequently (e.g., every 1 hour). The example key generator tlsticketupdate.go is available under contrib directory in nghttp2 archive. The memcached entry key is \fBnghttpx:tls\-ticket\-key\fP\&. The data format stored in memcached is the binary format described below: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C +\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ | VERSION (4) |LEN (2)|KEY(48 or 80) ... +\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ ^ | | | +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+ (LEN, KEY) pair can be repeated .ft P .fi .UNINDENT .UNINDENT .sp All numbers in the above figure is bytes. All integer fields are network byte order. .sp First 4 bytes integer VERSION field, which must be 1. The 2 bytes integer LEN field gives the length of following KEY field, which contains key. If \fI\%\-\-tls\-ticket\-key\-cipher\fP=aes\-128\-cbc is used, LEN must be 48. If \fI\%\-\-tls\-ticket\-key\-cipher\fP=aes\-256\-cbc is used, LEN must be 80. LEN and KEY pair can be repeated multiple times to store multiple keys. The key appeared first is used as encryption key. All the remaining keys are used as decryption only. .sp By default, connections to memcached server are not encrypted. To enable encryption, use \fBtls\fP keyword in \fI\%\-\-tls\-ticket\-key\-memcached\fP option. .sp If \fI\%\-\-tls\-ticket\-key\-file\fP is given, encryption key is read from the given file. In this case, nghttpx does not rotate key automatically. To rotate key, one has to restart nghttpx (see SIGNALS). .SH CERTIFICATE TRANSPARENCY .sp nghttpx supports TLS \fBsigned_certificate_timestamp\fP extension (\fI\%RFC 6962\fP). The relevant options are \fI\%\-\-tls\-sct\-dir\fP and \fBsct\-dir\fP parameter in \fI\%\-\-subcert\fP\&. They takes a directory, and nghttpx reads all files whose extension is \fB\&.sct\fP under the directory. The \fB*.sct\fP files are encoded as \fBSignedCertificateTimestamp\fP struct described in \fI\%section 3.2 of RFC 69662\fP\&. This format is the same one used by \fI\%nginx\-ct\fP and \fI\%mod_ssl_ct\fP\&. \fI\%ct\-submit\fP can be used to submit certificates to log servers, and obtain the \fBSignedCertificateTimestamp\fP struct which can be used with nghttpx. .SH MRUBY SCRIPTING .sp \fBWARNING:\fP .INDENT 0.0 .INDENT 3.5 The current mruby extension API is experimental and not frozen. The API is subject to change in the future release. .UNINDENT .UNINDENT .sp \fBWARNING:\fP .INDENT 0.0 .INDENT 3.5 Almost all string value returned from method, or attribute is a fresh new mruby string, which involves memory allocation, and copies. Therefore, it is strongly recommended to store a return value in a local variable, and use it, instead of calling method or accessing attribute repeatedly. .UNINDENT .UNINDENT .sp nghttpx allows users to extend its capability using mruby scripts. nghttpx has 2 hook points to execute mruby script: request phase and response phase. The request phase hook is invoked after all request header fields are received from client. The response phase hook is invoked after all response header fields are received from backend server. These hooks allows users to modify header fields, or common HTTP variables, like authority or request path, and even return custom response without forwarding request to backend servers. .sp There are 2 levels of mruby script invocations: global and per\-pattern. The global mruby script is set by \fI\%\-\-mruby\-file\fP option and is called for all requests. The per\-pattern mruby script is set by \(dqmruby\(dq parameter in \fI\%\-b\fP option. It is invoked for a request which matches the particular pattern. The order of hook invocation is: global request phase hook, per\-pattern request phase hook, per\-pattern response phase hook, and finally global response phase hook. If a hook returns a response, any later hooks are not invoked. The global request hook is invoked before the pattern matching is made and changing request path may affect the pattern matching. .sp Please note that request and response hooks of per\-pattern mruby script for a single request might not come from the same script. This might happen after a request hook is executed, backend failed for some reason, and at the same time, backend configuration is replaced by API request, and then the request uses new configuration on retry. The response hook from new configuration, if it is specified, will be invoked. .sp The all mruby script will be evaluated once per thread on startup, and it must instantiate object and evaluate it as the return value (e.g., \fBApp.new\fP). This object is called app object. If app object defines \fBon_req\fP method, it is called with \fI\%Nghttpx::Env\fP object on request hook. Similarly, if app object defines \fBon_resp\fP method, it is called with \fI\%Nghttpx::Env\fP object on response hook. For each method invocation, user can can access \fI\%Nghttpx::Request\fP and \fI\%Nghttpx::Response\fP objects via \fI\%Nghttpx::Env#req\fP and \fI\%Nghttpx::Env#resp\fP respectively. .INDENT 0.0 .TP .B Nghttpx::REQUEST_PHASE Constant to represent request phase. .UNINDENT .INDENT 0.0 .TP .B Nghttpx::RESPONSE_PHASE Constant to represent response phase. .UNINDENT .INDENT 0.0 .TP .B class Nghttpx::Env Object to represent current request specific context. .INDENT 7.0 .TP .B attribute [R] req Return \fI\%Request\fP object. .UNINDENT .INDENT 7.0 .TP .B attribute [R] resp Return \fI\%Response\fP object. .UNINDENT .INDENT 7.0 .TP .B attribute [R] ctx Return Ruby hash object. It persists until request finishes. So values set in request phase hook can be retrieved in response phase hook. .UNINDENT .INDENT 7.0 .TP .B attribute [R] phase Return the current phase. .UNINDENT .INDENT 7.0 .TP .B attribute [R] remote_addr Return IP address of a remote client. If connection is made via UNIX domain socket, this returns the string \(dqlocalhost\(dq. .UNINDENT .INDENT 7.0 .TP .B attribute [R] server_addr Return address of server that accepted the connection. This is a string which specified in \fI\%\-\-frontend\fP option, excluding port number, and not a resolved IP address. For UNIX domain socket, this is a path to UNIX domain socket. .UNINDENT .INDENT 7.0 .TP .B attribute [R] server_port Return port number of the server frontend which accepted the connection from client. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_used Return true if TLS is used on the connection. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_sni Return the TLS SNI value which client sent in this connection. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_client_fingerprint_sha256 Return the SHA\-256 fingerprint of a client certificate. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_client_fingerprint_sha1 Return the SHA\-1 fingerprint of a client certificate. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_client_issuer_name Return the issuer name of a client certificate. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_client_subject_name Return the subject name of a client certificate. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_client_serial Return the serial number of a client certificate. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_client_not_before Return the start date of a client certificate in seconds since the epoch. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_client_not_after Return the end date of a client certificate in seconds since the epoch. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_cipher Return a TLS cipher negotiated in this connection. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_protocol Return a TLS protocol version negotiated in this connection. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_session_id Return a session ID for this connection in hex string. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_session_reused Return true if, and only if a SSL/TLS session is reused. .UNINDENT .INDENT 7.0 .TP .B attribute [R] alpn Return ALPN identifier negotiated in this connection. .UNINDENT .INDENT 7.0 .TP .B attribute [R] tls_handshake_finished Return true if SSL/TLS handshake has finished. If it returns false in the request phase hook, the request is received in TLSv1.3 early data (0\-RTT) and might be vulnerable to the replay attack. nghttpx will send Early\-Data header field to backend servers to indicate this. .UNINDENT .UNINDENT .INDENT 0.0 .TP .B class Nghttpx::Request Object to represent request from client. The modification to Request object is allowed only in request phase hook. .INDENT 7.0 .TP .B attribute [R] http_version_major Return HTTP major version. .UNINDENT .INDENT 7.0 .TP .B attribute [R] http_version_minor Return HTTP minor version. .UNINDENT .INDENT 7.0 .TP .B attribute [R/W] method HTTP method. On assignment, copy of given value is assigned. We don\(aqt accept arbitrary method name. We will document them later, but well known methods, like GET, PUT and POST, are all supported. .UNINDENT .INDENT 7.0 .TP .B attribute [R/W] authority Authority (i.e., example.org), including optional port component . On assignment, copy of given value is assigned. .UNINDENT .INDENT 7.0 .TP .B attribute [R/W] scheme Scheme (i.e., http, https). On assignment, copy of given value is assigned. .UNINDENT .INDENT 7.0 .TP .B attribute [R/W] path Request path, including query component (i.e., /index.html). On assignment, copy of given value is assigned. The path does not include authority component of URI. This may include query component. nghttpx makes certain normalization for path. It decodes percent\-encoding for unreserved characters (see \fI\%https://tools.ietf.org/html/rfc3986#section\-2.3\fP), and resolves \(dq..\(dq and \(dq.\(dq. But it may leave characters which should be percent\-encoded as is. So be careful when comparing path against desired string. .UNINDENT .INDENT 7.0 .TP .B attribute [R] headers Return Ruby hash containing copy of request header fields. Changing values in returned hash does not change request header fields actually used in request processing. Use \fI\%Nghttpx::Request#add_header\fP or \fI\%Nghttpx::Request#set_header\fP to change request header fields. .UNINDENT .INDENT 7.0 .TP .B add_header(key, value) Add header entry associated with key. The value can be single string or array of string. It does not replace any existing values associated with key. .UNINDENT .INDENT 7.0 .TP .B set_header(key, value) Set header entry associated with key. The value can be single string or array of string. It replaces any existing values associated with key. .UNINDENT .INDENT 7.0 .TP .B clear_headers() Clear all existing request header fields. .UNINDENT .INDENT 7.0 .TP .B push(uri) Initiate to push resource identified by \fIuri\fP\&. Only HTTP/2 protocol supports this feature. For the other protocols, this method is noop. \fIuri\fP can be absolute URI, absolute path or relative path to the current request. For absolute or relative path, scheme and authority are inherited from the current request. Currently, method is always GET. nghttpx will issue request to backend servers to fulfill this request. The request and response phase hooks will be called for pushed resource as well. .UNINDENT .UNINDENT .INDENT 0.0 .TP .B class Nghttpx::Response Object to represent response from backend server. .INDENT 7.0 .TP .B attribute [R] http_version_major Return HTTP major version. .UNINDENT .INDENT 7.0 .TP .B attribute [R] http_version_minor Return HTTP minor version. .UNINDENT .INDENT 7.0 .TP .B attribute [R/W] status HTTP status code. It must be in the range [200, 999], inclusive. The non\-final status code is not supported in mruby scripting at the moment. .UNINDENT .INDENT 7.0 .TP .B attribute [R] headers Return Ruby hash containing copy of response header fields. Changing values in returned hash does not change response header fields actually used in response processing. Use \fI\%Nghttpx::Response#add_header\fP or \fI\%Nghttpx::Response#set_header\fP to change response header fields. .UNINDENT .INDENT 7.0 .TP .B add_header(key, value) Add header entry associated with key. The value can be single string or array of string. It does not replace any existing values associated with key. .UNINDENT .INDENT 7.0 .TP .B set_header(key, value) Set header entry associated with key. The value can be single string or array of string. It replaces any existing values associated with key. .UNINDENT .INDENT 7.0 .TP .B clear_headers() Clear all existing response header fields. .UNINDENT .INDENT 7.0 .TP .B return(body) Return custom response \fIbody\fP to a client. When this method is called in request phase hook, the request is not forwarded to the backend, and response phase hook for this request will not be invoked. When this method is called in response phase hook, response from backend server is canceled and discarded. The status code and response header fields should be set before using this method. To set status code, use \fI\%Nghttpx::Response#status\fP\&. If status code is not set, 200 is used. To set response header fields, \fI\%Nghttpx::Response#add_header\fP and \fI\%Nghttpx::Response#set_header\fP\&. When this method is invoked in response phase hook, the response headers are filled with the ones received from backend server. To send completely custom header fields, first call \fI\%Nghttpx::Response#clear_headers\fP to erase all existing header fields, and then add required header fields. It is an error to call this method twice for a given request. .UNINDENT .INDENT 7.0 .TP .B send_info(status, headers) Send non\-final (informational) response to a client. \fIstatus\fP must be in the range [100, 199], inclusive. \fIheaders\fP is a hash containing response header fields. Its key must be a string, and the associated value must be either string or array of strings. Since this is not a final response, even if this method is invoked, request is still forwarded to a backend unless \fI\%Nghttpx::Response#return\fP is called. This method can be called multiple times. It cannot be called after \fI\%Nghttpx::Response#return\fP is called. .UNINDENT .UNINDENT .SS MRUBY EXAMPLES .sp Modify request path: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C class App def on_req(env) env.req.path = \(dq/apps#{env.req.path}\(dq end end App.new .ft P .fi .UNINDENT .UNINDENT .sp Don\(aqt forget to instantiate and evaluate object at the last line. .sp Restrict permission of viewing a content to a specific client addresses: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C class App def on_req(env) allowed_clients = [\(dq127.0.0.1\(dq, \(dq::1\(dq] if env.req.path.start_with?(\(dq/log/\(dq) && !allowed_clients.include?(env.remote_addr) then env.resp.status = 404 env.resp.return \(dqpermission denied\(dq end end end App.new .ft P .fi .UNINDENT .UNINDENT .SH API ENDPOINTS .sp nghttpx exposes API endpoints to manipulate it via HTTP based API. By default, API endpoint is disabled. To enable it, add a dedicated frontend for API using \fI\%\-\-frontend\fP option with \(dqapi\(dq parameter. All requests which come from this frontend address, will be treated as API request. .sp The response is normally JSON dictionary, and at least includes the following keys: .INDENT 0.0 .TP .B status The status of the request processing. The following values are defined: .INDENT 7.0 .TP .B Success The request was successful. .TP .B Failure The request was failed. No change has been made. .UNINDENT .TP .B code HTTP status code .UNINDENT .sp Additionally, depending on the API endpoint, \fBdata\fP key may be present, and its value contains the API endpoint specific data. .sp We wrote \(dqnormally\(dq, since nghttpx may return ordinal HTML response in some cases where the error has occurred before reaching API endpoint (e.g., header field is too large). .sp The following section describes available API endpoints. .SS POST /api/v1beta1/backendconfig .sp This API replaces the current backend server settings with the requested ones. The request method should be POST, but PUT is also acceptable. The request body must be nghttpx configuration file format. For configuration file format, see \fI\%FILES\fP section. The line separator inside the request body must be single LF (0x0A). Currently, only \fI\%backend\fP option is parsed, the others are simply ignored. The semantics of this API is replace the current backend with the backend options in request body. Describe the desired set of backend severs, and nghttpx makes it happen. If there is no \fI\%backend\fP option is found in request body, the current set of backend is replaced with the \fI\%backend\fP option\(aqs default value, which is \fB127.0.0.1,80\fP\&. .sp The replacement is done instantly without breaking existing connections or requests. It also avoids any process creation as is the case with hot swapping with signals. .sp The one limitation is that only numeric IP address is allowed in \fI\%backend\fP in request body unless \(dqdns\(dq parameter is used while non numeric hostname is allowed in command\-line or configuration file is read using \fI\%\-\-conf\fP\&. .SS GET /api/v1beta1/configrevision .sp This API returns configuration revision of the current nghttpx. The configuration revision is opaque string, and it changes after each reloading by SIGHUP. With this API, an external application knows that whether nghttpx has finished reloading its configuration by comparing the configuration revisions between before and after reloading. It is recommended to disable persistent (keep\-alive) connection for this purpose in order to avoid to send a request using the reused connection which may bound to an old process. .sp This API returns response including \fBdata\fP key. Its value is JSON object, and it contains at least the following key: .INDENT 0.0 .TP .B configRevision The configuration revision of the current nghttpx .UNINDENT .SH SEE ALSO .sp \fBnghttp(1)\fP, \fBnghttpd(1)\fP, \fBh2load(1)\fP .SH AUTHOR Tatsuhiro Tsujikawa .SH COPYRIGHT 2012, 2015, 2016, Tatsuhiro Tsujikawa .\" Generated by docutils manpage writer. . PK8hZOMG==share/man/man1/h2load.1nu[.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "H2LOAD" "1" "Apr 04, 2024" "1.61.0" "nghttp2" .SH NAME h2load \- HTTP/2 benchmarking tool .SH SYNOPSIS .sp \fBh2load\fP [OPTIONS]... [URI]... .SH DESCRIPTION .sp benchmarking tool for HTTP/2 server .INDENT 0.0 .TP .B Specify URI to access. Multiple URIs can be specified. URIs are used in this order for each client. All URIs are used, then first URI is used and then 2nd URI, and so on. The scheme, host and port in the subsequent URIs, if present, are ignored. Those in the first URI are used solely. Definition of a base URI overrides all scheme, host or port values. .UNINDENT .SH OPTIONS .INDENT 0.0 .TP .B \-n, \-\-requests= Number of requests across all clients. If it is used with \fI\%\-\-timing\-script\-file\fP option, this option specifies the number of requests each client performs rather than the number of requests across all clients. This option is ignored if timing\-based benchmarking is enabled (see \fI\%\-\-duration\fP option). .sp Default: \fB1\fP .UNINDENT .INDENT 0.0 .TP .B \-c, \-\-clients= Number of concurrent clients. With \fI\%\-r\fP option, this specifies the maximum number of connections to be made. .sp Default: \fB1\fP .UNINDENT .INDENT 0.0 .TP .B \-t, \-\-threads= Number of native threads. .sp Default: \fB1\fP .UNINDENT .INDENT 0.0 .TP .B \-i, \-\-input\-file= Path of a file with multiple URIs are separated by EOLs. This option will disable URIs getting from command\-line. If \(aq\-\(aq is given as , URIs will be read from stdin. URIs are used in this order for each client. All URIs are used, then first URI is used and then 2nd URI, and so on. The scheme, host and port in the subsequent URIs, if present, are ignored. Those in the first URI are used solely. Definition of a base URI overrides all scheme, host or port values. .UNINDENT .INDENT 0.0 .TP .B \-m, \-\-max\-concurrent\-streams= Max concurrent streams to issue per session. When http/1.1 is used, this specifies the number of HTTP pipelining requests in\-flight. .sp Default: \fB1\fP .UNINDENT .INDENT 0.0 .TP .B \-f, \-\-max\-frame\-size= Maximum frame size that the local endpoint is willing to receive. .sp Default: \fB16K\fP .UNINDENT .INDENT 0.0 .TP .B \-w, \-\-window\-bits= Sets the stream level initial window size to (2**)\-1. For QUIC, is capped to 26 (roughly 64MiB). .sp Default: \fB30\fP .UNINDENT .INDENT 0.0 .TP .B \-W, \-\-connection\-window\-bits= Sets the connection level initial window size to (2**)\-1. .sp Default: \fB30\fP .UNINDENT .INDENT 0.0 .TP .B \-H, \-\-header=
Add/Override a header to the requests. .UNINDENT .INDENT 0.0 .TP .B \-\-ciphers= Set allowed cipher list for TLSv1.2 or earlier. The format of the string is described in OpenSSL ciphers(1). .sp Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP .UNINDENT .INDENT 0.0 .TP .B \-\-tls13\-ciphers= Set allowed cipher list for TLSv1.3. The format of the string is described in OpenSSL ciphers(1). .sp Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256\fP .UNINDENT .INDENT 0.0 .TP .B \-p, \-\-no\-tls\-proto= Specify ALPN identifier of the protocol to be used when accessing http URI without SSL/TLS. Available protocols: h2c and http/1.1 .sp Default: \fBh2c\fP .UNINDENT .INDENT 0.0 .TP .B \-d, \-\-data= Post FILE to server. The request method is changed to POST. For http/1.1 connection, if \fI\%\-d\fP is used, the maximum number of in\-flight pipelined requests is set to 1. .UNINDENT .INDENT 0.0 .TP .B \-r, \-\-rate= Specifies the fixed rate at which connections are created. The rate must be a positive integer, representing the number of connections to be made per rate period. The maximum number of connections to be made is given in \fI\%\-c\fP option. This rate will be distributed among threads as evenly as possible. For example, with \fI\%\-t\fP2 and \fI\%\-r\fP4, each thread gets 2 connections per period. When the rate is 0, the program will run as it normally does, creating connections at whatever variable rate it wants. The default value for this option is 0. \fI\%\-r\fP and \fI\%\-D\fP are mutually exclusive. .UNINDENT .INDENT 0.0 .TP .B \-\-rate\-period= Specifies the time period between creating connections. The period must be a positive number, representing the length of the period in time. This option is ignored if the rate option is not used. The default value for this option is 1s. .UNINDENT .INDENT 0.0 .TP .B \-D, \-\-duration= Specifies the main duration for the measurements in case of timing\-based benchmarking. \fI\%\-D\fP and \fI\%\-r\fP are mutually exclusive. .UNINDENT .INDENT 0.0 .TP .B \-\-warm\-up\-time= Specifies the time period before starting the actual measurements, in case of timing\-based benchmarking. Needs to provided along with \fI\%\-D\fP option. .UNINDENT .INDENT 0.0 .TP .B \-T, \-\-connection\-active\-timeout= Specifies the maximum time that h2load is willing to keep a connection open, regardless of the activity on said connection. must be a positive integer, specifying the amount of time to wait. When no timeout value is set (either active or inactive), h2load will keep a connection open indefinitely, waiting for a response. .UNINDENT .INDENT 0.0 .TP .B \-N, \-\-connection\-inactivity\-timeout= Specifies the amount of time that h2load is willing to wait to see activity on a given connection. must be a positive integer, specifying the amount of time to wait. When no timeout value is set (either active or inactive), h2load will keep a connection open indefinitely, waiting for a response. .UNINDENT .INDENT 0.0 .TP .B \-\-timing\-script\-file= Path of a file containing one or more lines separated by EOLs. Each script line is composed of two tab\-separated fields. The first field represents the time offset from the start of execution, expressed as a positive value of milliseconds with microsecond resolution. The second field represents the URI. This option will disable URIs getting from command\-line. If \(aq\-\(aq is given as , script lines will be read from stdin. Script lines are used in order for each client. If \fI\%\-n\fP is given, it must be less than or equal to the number of script lines, larger values are clamped to the number of script lines. If \fI\%\-n\fP is not given, the number of requests will default to the number of script lines. The scheme, host and port defined in the first URI are used solely. Values contained in other URIs, if present, are ignored. Definition of a base URI overrides all scheme, host or port values. \fI\%\-\-timing\-script\-file\fP and \fI\%\-\-rps\fP are mutually exclusive. .UNINDENT .INDENT 0.0 .TP .B \-B, \-\-base\-uri=(|unix:) Specify URI from which the scheme, host and port will be used for all requests. The base URI overrides all values defined either at the command line or inside input files. If argument starts with \(dqunix:\(dq, then the rest of the argument will be treated as UNIX domain socket path. The connection is made through that path instead of TCP. In this case, scheme is inferred from the first URI appeared in the command line or inside input files as usual. .UNINDENT .INDENT 0.0 .TP .B \-\-alpn\-list= Comma delimited list of ALPN protocol identifier sorted in the order of preference. That means most desirable protocol comes first. The parameter must be delimited by a single comma only and any white spaces are treated as a part of protocol string. .sp Default: \fBh2,h2\-16,h2\-14,http/1.1\fP .UNINDENT .INDENT 0.0 .TP .B \-\-h1 Short hand for \fI\%\-\-alpn\-list\fP=http/1.1 \fI\%\-\-no\-tls\-proto\fP=http/1.1, which effectively force http/1.1 for both http and https URI. .UNINDENT .INDENT 0.0 .TP .B \-\-header\-table\-size= Specify decoder header table size. .sp Default: \fB4K\fP .UNINDENT .INDENT 0.0 .TP .B \-\-encoder\-header\-table\-size= Specify encoder header table size. The decoder (server) specifies the maximum dynamic table size it accepts. Then the negotiated dynamic table size is the minimum of this option value and the value which server specified. .sp Default: \fB4K\fP .UNINDENT .INDENT 0.0 .TP .B \-\-log\-file= Write per\-request information to a file as tab\-separated columns: start time as microseconds since epoch; HTTP status code; microseconds until end of response. More columns may be added later. Rows are ordered by end\-of\- response time when using one worker thread, but may appear slightly out of order with multiple threads due to buffering. Status code is \-1 for failed streams. .UNINDENT .INDENT 0.0 .TP .B \-\-qlog\-file\-base= Enable qlog output and specify base file name for qlogs. Qlog is emitted for each connection. For a given base name \(dqbase\(dq, each output file name becomes \(dqbase.M.N.sqlog\(dq where M is worker ID and N is client ID (e.g. \(dqbase.0.3.sqlog\(dq). Only effective in QUIC runs. .UNINDENT .INDENT 0.0 .TP .B \-\-connect\-to=[:] Host and port to connect instead of using the authority in . .UNINDENT .INDENT 0.0 .TP .B \-\-rps= Specify request per second for each client. \fI\%\-\-rps\fP and \fI\%\-\-timing\-script\-file\fP are mutually exclusive. .UNINDENT .INDENT 0.0 .TP .B \-\-groups= Specify the supported groups. .sp Default: \fBX25519:P\-256:P\-384:P\-521\fP .UNINDENT .INDENT 0.0 .TP .B \-\-no\-udp\-gso Disable UDP GSO. .UNINDENT .INDENT 0.0 .TP .B \-\-max\-udp\-payload\-size= Specify the maximum outgoing UDP datagram payload size. .UNINDENT .INDENT 0.0 .TP .B \-\-ktls Enable ktls. .UNINDENT .INDENT 0.0 .TP .B \-\-sni= Send in TLS SNI, overriding the host name specified in URI. .UNINDENT .INDENT 0.0 .TP .B \-v, \-\-verbose Output debug information. .UNINDENT .INDENT 0.0 .TP .B \-\-version Display version information and exit. .UNINDENT .INDENT 0.0 .TP .B \-h, \-\-help Display this help and exit. .UNINDENT .sp The argument is an integer and an optional unit (e.g., 10K is 10 * 1024). Units are K, M and G (powers of 1024). .sp The argument is an integer and an optional unit (e.g., 1s is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms (hours, minutes, seconds and milliseconds, respectively). If a unit is omitted, a second is used as unit. .SH OUTPUT .INDENT 0.0 .TP .B requests .INDENT 7.0 .TP .B total The number of requests h2load was instructed to make. .TP .B started The number of requests h2load has started. .TP .B done The number of requests completed. .TP .B succeeded The number of requests completed successfully. Only HTTP status code 2xx or3xx are considered as success. .TP .B failed The number of requests failed, including HTTP level failures (non\-successful HTTP status code). .TP .B errored The number of requests failed, except for HTTP level failures. This is the subset of the number reported in \fBfailed\fP and most likely the network level failures or stream was reset by RST_STREAM. .TP .B timeout The number of requests whose connection timed out before they were completed. This is the subset of the number reported in \fBerrored\fP\&. .UNINDENT .TP .B status codes The number of status code h2load received. .TP .B traffic .INDENT 7.0 .TP .B total The number of bytes received from the server \(dqon the wire\(dq. If requests were made via TLS, this value is the number of decrypted bytes. .TP .B headers The number of response header bytes from the server without decompression. The \fBspace savings\fP shows efficiency of header compression. Let \fBdecompressed(headers)\fP to the number of bytes used for header fields after decompression. The \fBspace savings\fP is calculated by (1 \- \fBheaders\fP / \fBdecompressed(headers)\fP) * 100. For HTTP/1.1, this is usually 0.00%, since it does not have header compression. For HTTP/2, it shows some insightful numbers. .TP .B data The number of response body bytes received from the server. .UNINDENT .TP .B time for request .INDENT 7.0 .TP .B min The minimum time taken for request and response. .TP .B max The maximum time taken for request and response. .TP .B mean The mean time taken for request and response. .TP .B sd The standard deviation of the time taken for request and response. .TP .B +/\- sd The fraction of the number of requests within standard deviation range (mean +/\- sd) against total number of successful requests. .UNINDENT .TP .B time for connect .INDENT 7.0 .TP .B min The minimum time taken to connect to a server including TLS handshake. .TP .B max The maximum time taken to connect to a server including TLS handshake. .TP .B mean The mean time taken to connect to a server including TLS handshake. .TP .B sd The standard deviation of the time taken to connect to a server. .TP .B +/\- sd The fraction of the number of connections within standard deviation range (mean +/\- sd) against total number of successful connections. .UNINDENT .TP .B time for 1st byte (of (decrypted in case of TLS) application data) .INDENT 7.0 .TP .B min The minimum time taken to get 1st byte from a server. .TP .B max The maximum time taken to get 1st byte from a server. .TP .B mean The mean time taken to get 1st byte from a server. .TP .B sd The standard deviation of the time taken to get 1st byte from a server. .TP .B +/\- sd The fraction of the number of connections within standard deviation range (mean +/\- sd) against total number of successful connections. .UNINDENT .TP .B req/s .INDENT 7.0 .TP .B min The minimum request per second among all clients. .TP .B max The maximum request per second among all clients. .TP .B mean The mean request per second among all clients. .TP .B sd The standard deviation of request per second among all clients. server. .TP .B +/\- sd The fraction of the number of connections within standard deviation range (mean +/\- sd) against total number of successful connections. .UNINDENT .UNINDENT .SH FLOW CONTROL .sp h2load sets large flow control window by default, and effectively disables flow control to avoid under utilization of server performance. To set smaller flow control window, use \fI\%\-w\fP and \fI\%\-W\fP options. For example, use \fB\-w16 \-W16\fP to set default window size described in HTTP/2 protocol specification. .SH SEE ALSO .sp \fBnghttp(1)\fP, \fBnghttpd(1)\fP, \fBnghttpx(1)\fP .SH AUTHOR Tatsuhiro Tsujikawa .SH COPYRIGHT 2012, 2015, 2016, Tatsuhiro Tsujikawa .\" Generated by docutils manpage writer. . PK8hZL[0#0#share/man/man1/nghttp.1nu[.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "NGHTTP" "1" "Apr 04, 2024" "1.61.0" "nghttp2" .SH NAME nghttp \- HTTP/2 client .SH SYNOPSIS .sp \fBnghttp\fP [OPTIONS]... ... .SH DESCRIPTION .sp HTTP/2 client .INDENT 0.0 .TP .B Specify URI to access. .UNINDENT .SH OPTIONS .INDENT 0.0 .TP .B \-v, \-\-verbose Print debug information such as reception and transmission of frames and name/value pairs. Specifying this option multiple times increases verbosity. .UNINDENT .INDENT 0.0 .TP .B \-n, \-\-null\-out Discard downloaded data. .UNINDENT .INDENT 0.0 .TP .B \-O, \-\-remote\-name Save download data in the current directory. The filename is derived from URI. If URI ends with \(aq\fI/\fP\(aq, \(aqindex.html\(aq is used as a filename. Not implemented yet. .UNINDENT .INDENT 0.0 .TP .B \-t, \-\-timeout= Timeout each request after . Set 0 to disable timeout. .UNINDENT .INDENT 0.0 .TP .B \-w, \-\-window\-bits= Sets the stream level initial window size to 2**\-1. .UNINDENT .INDENT 0.0 .TP .B \-W, \-\-connection\-window\-bits= Sets the connection level initial window size to 2**\-1. .UNINDENT .INDENT 0.0 .TP .B \-a, \-\-get\-assets Download assets such as stylesheets, images and script files linked from the downloaded resource. Only links whose origins are the same with the linking resource will be downloaded. nghttp prioritizes resources using HTTP/2 dependency based priority. The priority order, from highest to lowest, is html itself, css, javascript and images. .UNINDENT .INDENT 0.0 .TP .B \-s, \-\-stat Print statistics. .UNINDENT .INDENT 0.0 .TP .B \-H, \-\-header=
Add a header to the requests. Example: \fI\%\-H\fP\(aq:method: PUT\(aq .UNINDENT .INDENT 0.0 .TP .B \-\-trailer=
Add a trailer header to the requests.
must not include pseudo header field (header field name starting with \(aq:\(aq). To send trailer, one must use \fI\%\-d\fP option to send request body. Example: \fI\%\-\-trailer\fP \(aqfoo: bar\(aq. .UNINDENT .INDENT 0.0 .TP .B \-\-cert= Use the specified client certificate file. The file must be in PEM format. .UNINDENT .INDENT 0.0 .TP .B \-\-key= Use the client private key file. The file must be in PEM format. .UNINDENT .INDENT 0.0 .TP .B \-d, \-\-data= Post FILE to server. If \(aq\-\(aq is given, data will be read from stdin. .UNINDENT .INDENT 0.0 .TP .B \-m, \-\-multiply= Request each URI times. By default, same URI is not requested twice. This option disables it too. .UNINDENT .INDENT 0.0 .TP .B \-u, \-\-upgrade Perform HTTP Upgrade for HTTP/2. This option is ignored if the request URI has https scheme. If \fI\%\-d\fP is used, the HTTP upgrade request is performed with OPTIONS method. .UNINDENT .INDENT 0.0 .TP .B \-p, \-\-weight= Sets weight of given URI. This option can be used multiple times, and N\-th \fI\%\-p\fP option sets weight of N\-th URI in the command line. If the number of \fI\%\-p\fP option is less than the number of URI, the last \fI\%\-p\fP option value is repeated. If there is no \fI\%\-p\fP option, default weight, 16, is assumed. The valid value range is [1, 256], inclusive. .UNINDENT .INDENT 0.0 .TP .B \-M, \-\-peer\-max\-concurrent\-streams= Use as SETTINGS_MAX_CONCURRENT_STREAMS value of remote endpoint as if it is received in SETTINGS frame. .sp Default: \fB100\fP .UNINDENT .INDENT 0.0 .TP .B \-c, \-\-header\-table\-size= Specify decoder header table size. If this option is used multiple times, and the minimum value among the given values except for last one is strictly less than the last value, that minimum value is set in SETTINGS frame payload before the last value, to simulate multiple header table size change. .UNINDENT .INDENT 0.0 .TP .B \-\-encoder\-header\-table\-size= Specify encoder header table size. The decoder (server) specifies the maximum dynamic table size it accepts. Then the negotiated dynamic table size is the minimum of this option value and the value which server specified. .UNINDENT .INDENT 0.0 .TP .B \-b, \-\-padding= Add at most bytes to a frame payload as padding. Specify 0 to disable padding. .UNINDENT .INDENT 0.0 .TP .B \-r, \-\-har= Output HTTP transactions in HAR format. If \(aq\-\(aq is given, data is written to stdout. .UNINDENT .INDENT 0.0 .TP .B \-\-color Force colored log output. .UNINDENT .INDENT 0.0 .TP .B \-\-continuation Send large header to test CONTINUATION. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-content\-length Don\(aqt send content\-length header field. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-dep Don\(aqt send dependency based priority hint to server. .UNINDENT .INDENT 0.0 .TP .B \-\-hexdump Display the incoming traffic in hexadecimal (Canonical hex+ASCII display). If SSL/TLS is used, decrypted data are used. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-push Disable server push. .UNINDENT .INDENT 0.0 .TP .B \-\-max\-concurrent\-streams= The number of concurrent pushed streams this client accepts. .UNINDENT .INDENT 0.0 .TP .B \-\-expect\-continue Perform an Expect/Continue handshake: wait to send DATA (up to a short timeout) until the server sends a 100 Continue interim response. This option is ignored unless combined with the \fI\%\-d\fP option. .UNINDENT .INDENT 0.0 .TP .B \-y, \-\-no\-verify\-peer Suppress warning on server certificate verification failure. .UNINDENT .INDENT 0.0 .TP .B \-\-ktls Enable ktls. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-rfc7540\-pri Disable RFC7540 priorities. .UNINDENT .INDENT 0.0 .TP .B \-\-version Display version information and exit. .UNINDENT .INDENT 0.0 .TP .B \-h, \-\-help Display this help and exit. .UNINDENT .sp The argument is an integer and an optional unit (e.g., 10K is 10 * 1024). Units are K, M and G (powers of 1024). .sp The argument is an integer and an optional unit (e.g., 1s is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms (hours, minutes, seconds and milliseconds, respectively). If a unit is omitted, a second is used as unit. .SH DEPENDENCY BASED PRIORITY .sp nghttp sends priority hints to server by default unless \fI\%\-\-no\-dep\fP is used. nghttp mimics the way Firefox employs to manages dependency using idle streams. We follows the behaviour of Firefox Nightly as of April, 2015, and nghttp\(aqs behaviour is very static and could be different from Firefox in detail. But reproducing the same behaviour of Firefox is not our goal. The goal is provide the easy way to test out the dependency priority in server implementation. .sp When connection is established, nghttp sends 5 PRIORITY frames to idle streams 3, 5, 7, 9 and 11 to create \(dqanchor\(dq nodes in dependency tree: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C +\-\-\-\-\-+ |id=0 | +\-\-\-\-\-+ ^ ^ ^ w=201 / | \e w=1 / | \e / w=101| \e +\-\-\-\-\-+ +\-\-\-\-\-+ +\-\-\-\-\-+ |id=3 | |id=5 | |id=7 | +\-\-\-\-\-+ +\-\-\-\-\-+ +\-\-\-\-\-+ ^ ^ w=1 | w=1 | | | +\-\-\-\-\-+ +\-\-\-\-\-+ |id=11| |id=9 | +\-\-\-\-\-+ +\-\-\-\-\-+ .ft P .fi .UNINDENT .UNINDENT .sp In the above figure, \fBid\fP means stream ID, and \fBw\fP means weight. The stream 0 is non\-existence stream, and forms the root of the tree. The stream 7 and 9 are not used for now. .sp The URIs given in the command\-line depend on stream 11 with the weight given in \fI\%\-p\fP option, which defaults to 16. .sp If \fI\%\-a\fP option is used, nghttp parses the resource pointed by URI given in command\-line as html, and extracts resource links from it. When requesting those resources, nghttp uses dependency according to its resource type. .sp For CSS, and Javascript files inside \(dqhead\(dq element, they depend on stream 3 with the weight 2. The Javascript files outside \(dqhead\(dq element depend on stream 5 with the weight 2. The mages depend on stream 11 with the weight 12. The other resources (e.g., icon) depend on stream 11 with the weight 2. .SH SEE ALSO .sp \fBnghttpd(1)\fP, \fBnghttpx(1)\fP, \fBh2load(1)\fP .SH AUTHOR Tatsuhiro Tsujikawa .SH COPYRIGHT 2012, 2015, 2016, Tatsuhiro Tsujikawa .\" Generated by docutils manpage writer. . PK8hZmshare/man/man1/nghttpd.1nu[.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "NGHTTPD" "1" "Apr 04, 2024" "1.61.0" "nghttp2" .SH NAME nghttpd \- HTTP/2 server .SH SYNOPSIS .sp \fBnghttpd\fP [OPTION]... [ ] .SH DESCRIPTION .sp HTTP/2 server .INDENT 0.0 .TP .B Specify listening port number. .UNINDENT .INDENT 0.0 .TP .B Set path to server\(aqs private key. Required unless \fI\%\-\-no\-tls\fP is specified. .UNINDENT .INDENT 0.0 .TP .B Set path to server\(aqs certificate. Required unless \fI\%\-\-no\-tls\fP is specified. .UNINDENT .SH OPTIONS .INDENT 0.0 .TP .B \-a, \-\-address= The address to bind to. If not specified the default IP address determined by getaddrinfo is used. .UNINDENT .INDENT 0.0 .TP .B \-D, \-\-daemon Run in a background. If \fI\%\-D\fP is used, the current working directory is changed to \(aq\fI/\fP\(aq. Therefore if this option is used, \fI\%\-d\fP option must be specified. .UNINDENT .INDENT 0.0 .TP .B \-V, \-\-verify\-client The server sends a client certificate request. If the client did not return a certificate, the handshake is terminated. Currently, this option just requests a client certificate and does not verify it. .UNINDENT .INDENT 0.0 .TP .B \-d, \-\-htdocs= Specify document root. If this option is not specified, the document root is the current working directory. .UNINDENT .INDENT 0.0 .TP .B \-v, \-\-verbose Print debug information such as reception/ transmission of frames and name/value pairs. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-tls Disable SSL/TLS. .UNINDENT .INDENT 0.0 .TP .B \-c, \-\-header\-table\-size= Specify decoder header table size. .UNINDENT .INDENT 0.0 .TP .B \-\-encoder\-header\-table\-size= Specify encoder header table size. The decoder (client) specifies the maximum dynamic table size it accepts. Then the negotiated dynamic table size is the minimum of this option value and the value which client specified. .UNINDENT .INDENT 0.0 .TP .B \-\-color Force colored log output. .UNINDENT .INDENT 0.0 .TP .B \-p, \-\-push== Push resources s when is requested. This option can be used repeatedly to specify multiple push configurations. and s are relative to document root. See \fI\%\-\-htdocs\fP option. Example: \fI\%\-p\fP/=/foo.png \fI\%\-p\fP/doc=/bar.css .UNINDENT .INDENT 0.0 .TP .B \-b, \-\-padding= Add at most bytes to a frame payload as padding. Specify 0 to disable padding. .UNINDENT .INDENT 0.0 .TP .B \-m, \-\-max\-concurrent\-streams= Set the maximum number of the concurrent streams in one HTTP/2 session. .sp Default: \fB100\fP .UNINDENT .INDENT 0.0 .TP .B \-n, \-\-workers= Set the number of worker threads. .sp Default: \fB1\fP .UNINDENT .INDENT 0.0 .TP .B \-e, \-\-error\-gzip Make error response gzipped. .UNINDENT .INDENT 0.0 .TP .B \-w, \-\-window\-bits= Sets the stream level initial window size to 2**\-1. .UNINDENT .INDENT 0.0 .TP .B \-W, \-\-connection\-window\-bits= Sets the connection level initial window size to 2**\-1. .UNINDENT .INDENT 0.0 .TP .B \-\-dh\-param\-file= Path to file that contains DH parameters in PEM format. Without this option, DHE cipher suites are not available. .UNINDENT .INDENT 0.0 .TP .B \-\-early\-response Start sending response when request HEADERS is received, rather than complete request is received. .UNINDENT .INDENT 0.0 .TP .B \-\-trailer=
Add a trailer header to a response.
must not include pseudo header field (header field name starting with \(aq:\(aq). The trailer is sent only if a response has body part. Example: \fI\%\-\-trailer\fP \(aqfoo: bar\(aq. .UNINDENT .INDENT 0.0 .TP .B \-\-hexdump Display the incoming traffic in hexadecimal (Canonical hex+ASCII display). If SSL/TLS is used, decrypted data are used. .UNINDENT .INDENT 0.0 .TP .B \-\-echo\-upload Send back uploaded content if method is POST or PUT. .UNINDENT .INDENT 0.0 .TP .B \-\-mime\-types\-file= Path to file that contains MIME media types and the extensions that represent them. .sp Default: \fB/etc/mime.types\fP .UNINDENT .INDENT 0.0 .TP .B \-\-no\-content\-length Don\(aqt send content\-length header field. .UNINDENT .INDENT 0.0 .TP .B \-\-ktls Enable ktls. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-rfc7540\-pri Disable RFC7540 priorities. .UNINDENT .INDENT 0.0 .TP .B \-\-version Display version information and exit. .UNINDENT .INDENT 0.0 .TP .B \-h, \-\-help Display this help and exit. .UNINDENT .sp The argument is an integer and an optional unit (e.g., 10K is 10 * 1024). Units are K, M and G (powers of 1024). .SH SEE ALSO .sp \fBnghttp(1)\fP, \fBnghttpx(1)\fP, \fBh2load(1)\fP .SH AUTHOR Tatsuhiro Tsujikawa .SH COPYRIGHT 2012, 2015, 2016, Tatsuhiro Tsujikawa .\" Generated by docutils manpage writer. . PK8hZgshare/doc/nghttp2/README.rstnu[nghttp2 - HTTP/2 C Library ========================== This is an implementation of the Hypertext Transfer Protocol version 2 in C. The framing layer of HTTP/2 is implemented as a reusable C library. On top of that, we have implemented an HTTP/2 client, server and proxy. We have also developed load test and benchmarking tools for HTTP/2. An HPACK encoder and decoder are available as a public API. Development Status ------------------ nghttp2 was originally developed based on `RFC 7540 `_ HTTP/2 and `RFC 7541 `_ HPACK - Header Compression for HTTP/2. Now we are updating our code to implement `RFC 9113 `_. The nghttp2 code base was forked from the spdylay (https://github.com/tatsuhiro-t/spdylay) project. Public Test Server ------------------ The following endpoints are available to try out our nghttp2 implementation. * https://nghttp2.org/ (TLS + ALPN and HTTP/3) This endpoint supports ``h2``, ``h2-16``, ``h2-14``, and ``http/1.1`` via ALPN and requires TLSv1.2 for HTTP/2 connection. It also supports HTTP/3. * http://nghttp2.org/ (HTTP Upgrade and HTTP/2 Direct) ``h2c`` and ``http/1.1``. Requirements ------------ The following package is required to build the libnghttp2 library: * pkg-config >= 0.20 To build the documentation, you need to install: * sphinx (http://sphinx-doc.org/) If you need libnghttp2 (C library) only, then the above packages are all you need. Use ``--enable-lib-only`` to ensure that only libnghttp2 is built. This avoids potential build error related to building bundled applications. To build and run the application programs (``nghttp``, ``nghttpd``, ``nghttpx`` and ``h2load``) in the ``src`` directory, the following packages are required: * OpenSSL >= 1.1.1; or LibreSSL >= 3.8.1; or aws-lc >= 1.19.0; or BoringSSL * libev >= 4.11 * zlib >= 1.2.3 * libc-ares >= 1.7.5 To enable ``-a`` option (getting linked assets from the downloaded resource) in ``nghttp``, the following package is required: * libxml2 >= 2.6.26 To enable systemd support in nghttpx, the following package is required: * libsystemd-dev >= 209 The HPACK tools require the following package: * jansson >= 2.5 To build sources under the examples directory, libevent is required: * libevent-openssl >= 2.0.8 To mitigate heap fragmentation in long running server programs (``nghttpd`` and ``nghttpx``), jemalloc is recommended: * jemalloc .. note:: Alpine Linux currently does not support malloc replacement due to musl limitations. See details in issue `#762 `_. For BoringSSL or aws-lc build, to enable :rfc:`8879` TLS Certificate Compression in applications, the following library is required: * libbrotli-dev >= 1.0.9 To enable mruby support for nghttpx, `mruby `_ is required. We need to build mruby with C++ ABI explicitly turned on, and probably need other mrgems, mruby is managed by git submodule under third-party/mruby directory. Currently, mruby support for nghttpx is disabled by default. To enable mruby support, use ``--with-mruby`` configure option. Note that at the time of this writing, libmruby-dev and mruby packages in Debian/Ubuntu are not usable for nghttp2, since they do not enable C++ ABI. To build mruby, the following packages are required: * ruby * bison nghttpx supports `neverbleed `_, privilege separation engine for OpenSSL. In short, it minimizes the risk of private key leakage when serious bug like Heartbleed is exploited. The neverbleed is disabled by default. To enable it, use ``--with-neverbleed`` configure option. To enable the experimental HTTP/3 support for h2load and nghttpx, the following libraries are required: * `OpenSSL with QUIC support `_; or LibreSSL (does not support 0RTT); or aws-lc; or `BoringSSL `_ (commit fae0964b3d44e94ca2a2d21f86e61dabe683d130) * `ngtcp2 `_ >= 1.4.0 * `nghttp3 `_ >= 1.1.0 Use ``--enable-http3`` configure option to enable HTTP/3 feature for h2load and nghttpx. In order to build optional eBPF program to direct an incoming QUIC UDP datagram to a correct socket for nghttpx, the following libraries are required: * libbpf-dev >= 0.7.0 Use ``--with-libbpf`` configure option to build eBPF program. libelf-dev is needed to build libbpf. For Ubuntu 20.04, you can build libbpf from `the source code `_. nghttpx requires eBPF program for reloading its configuration and hot swapping its executable. Compiling libnghttp2 C source code requires a C99 compiler. gcc 4.8 is known to be adequate. In order to compile the C++ source code, gcc >= 6.0 or clang >= 6.0 is required. C++ source code requires C++14 language features. .. note:: To enable mruby support in nghttpx, and use ``--with-mruby`` configure option. .. note:: Mac OS X users may need the ``--disable-threads`` configure option to disable multi-threading in nghttpd, nghttpx and h2load to prevent them from crashing. A patch is welcome to make multi threading work on Mac OS X platform. .. note:: To compile the associated applications (nghttp, nghttpd, nghttpx and h2load), you must use the ``--enable-app`` configure option and ensure that the specified requirements above are met. Normally, configure script checks required dependencies to build these applications, and enable ``--enable-app`` automatically, so you don't have to use it explicitly. But if you found that applications were not built, then using ``--enable-app`` may find that cause, such as the missing dependency. .. note:: In order to detect third party libraries, pkg-config is used (however we don't use pkg-config for some libraries (e.g., libev)). By default, pkg-config searches ``*.pc`` file in the standard locations (e.g., /usr/lib/pkgconfig). If it is necessary to use ``*.pc`` file in the custom location, specify paths to ``PKG_CONFIG_PATH`` environment variable, and pass it to configure script, like so: .. code-block:: text $ ./configure PKG_CONFIG_PATH=/path/to/pkgconfig For pkg-config managed libraries, ``*_CFLAG`` and ``*_LIBS`` environment variables are defined (e.g., ``OPENSSL_CFLAGS``, ``OPENSSL_LIBS``). Specifying non-empty string to these variables completely overrides pkg-config. In other words, if they are specified, pkg-config is not used for detection, and user is responsible to specify the correct values to these variables. For complete list of these variables, run ``./configure -h``. If you are using Ubuntu 22.04 LTS, run the following to install the required packages: .. code-block:: text sudo apt-get install g++ clang make binutils autoconf automake \ autotools-dev libtool pkg-config \ zlib1g-dev libssl-dev libxml2-dev libev-dev \ libevent-dev libjansson-dev \ libc-ares-dev libjemalloc-dev libsystemd-dev \ ruby-dev bison libelf-dev Building nghttp2 from release tar archive ----------------------------------------- The nghttp2 project regularly releases tar archives which includes nghttp2 source code, and generated build files. They can be downloaded from `Releases `_ page. Building nghttp2 from git requires autotools development packages. Building from tar archives does not require them, and thus it is much easier. The usual build step is as follows: .. code-block:: text $ tar xf nghttp2-X.Y.Z.tar.bz2 $ cd nghttp2-X.Y.Z $ ./configure $ make Building from git ----------------- Building from git is easy, but please be sure that at least autoconf 2.68 is used: .. code-block:: text $ git submodule update --init $ autoreconf -i $ automake $ autoconf $ ./configure $ make Notes for building on Windows (MSVC) ------------------------------------ The easiest way to build native Windows nghttp2 dll is use `cmake `_. The free version of `Visual C++ Build Tools `_ works fine. 1. Install cmake for windows 2. Open "Visual C++ ... Native Build Tool Command Prompt", and inside nghttp2 directly, run ``cmake``. 3. Then run ``cmake --build`` to build library. 4. nghttp2.dll, nghttp2.lib, nghttp2.exp are placed under lib directory. Note that the above steps most likely produce nghttp2 library only. No bundled applications are compiled. Notes for building on Windows (Mingw/Cygwin) -------------------------------------------- Under Mingw environment, you can only compile the library, it's ``libnghttp2-X.dll`` and ``libnghttp2.a``. If you want to compile the applications(``h2load``, ``nghttp``, ``nghttpx``, ``nghttpd``), you need to use the Cygwin environment. Under Cygwin environment, to compile the applications you need to compile and install the libev first. Secondly, you need to undefine the macro ``__STRICT_ANSI__``, if you not, the functions ``fdopen``, ``fileno`` and ``strptime`` will not available. the sample command like this: .. code-block:: text $ export CFLAGS="-U__STRICT_ANSI__ -I$libev_PREFIX/include -L$libev_PREFIX/lib" $ export CXXFLAGS=$CFLAGS $ ./configure $ make If you want to compile the applications under ``examples/``, you need to remove or rename the ``event.h`` from libev's installation, because it conflicts with libevent's installation. Notes for installation on Linux systems -------------------------------------------- After installing nghttp2 tool suite with ``make install`` one might experience a similar error: .. code-block:: text nghttpx: error while loading shared libraries: libnghttp2.so.14: cannot open shared object file: No such file or directory This means that the tool is unable to locate the ``libnghttp2.so`` shared library. To update the shared library cache run ``sudo ldconfig``. Building the documentation -------------------------- .. note:: Documentation is still incomplete. To build the documentation, run: .. code-block:: text $ make html The documents will be generated under ``doc/manual/html/``. The generated documents will not be installed with ``make install``. The online documentation is available at https://nghttp2.org/documentation/ Build HTTP/3 enabled h2load and nghttpx --------------------------------------- To build h2load and nghttpx with HTTP/3 feature enabled, run the configure script with ``--enable-http3``. For nghttpx to reload configurations and swapping its executable while gracefully terminating old worker processes, eBPF is required. Run the configure script with ``--enable-http3 --with-libbpf`` to build eBPF program. The QUIC keying material must be set with ``--frontend-quic-secret-file`` in order to keep the existing connections alive during reload. The detailed steps to build HTTP/3 enabled h2load and nghttpx follow. Build aws-lc: .. code-block:: text $ git clone --depth 1 -b v1.23.0 https://github.com/aws/aws-lc $ cd aws-lc $ cmake -B build -DDISABLE_GO=ON --install-prefix=$PWD/opt $ make -j$(nproc) -C build $ cmake --install build $ cd .. Build nghttp3: .. code-block:: text $ git clone --depth 1 -b v1.2.0 https://github.com/ngtcp2/nghttp3 $ cd nghttp3 $ git submodule update --init --depth 1 $ autoreconf -i $ ./configure --prefix=$PWD/build --enable-lib-only $ make -j$(nproc) $ make install $ cd .. Build ngtcp2: .. code-block:: text $ git clone --depth 1 -b v1.4.0 https://github.com/ngtcp2/ngtcp2 $ cd ngtcp2 $ git submodule update --init --depth 1 $ autoreconf -i $ ./configure --prefix=$PWD/build --enable-lib-only --with-boringssl \ BORINGSSL_CFLAGS="-I$PWD/../aws-lc/opt/include" \ BORINGSSL_LIBS="-L$PWD/../aws-lc/opt/lib -lssl -lcrypto" $ make -j$(nproc) $ make install $ cd .. If your Linux distribution does not have libbpf-dev >= 0.7.0, build from source: .. code-block:: text $ git clone --depth 1 -b v1.3.0 https://github.com/libbpf/libbpf $ cd libbpf $ PREFIX=$PWD/build make -C src install $ cd .. Build nghttp2: .. code-block:: text $ git clone https://github.com/nghttp2/nghttp2 $ cd nghttp2 $ git submodule update --init $ autoreconf -i $ ./configure --with-mruby --enable-http3 --with-libbpf \ CC=clang-15 CXX=clang++-15 \ PKG_CONFIG_PATH="$PWD/../aws-lc/opt/lib/pkgconfig:$PWD/../nghttp3/build/lib/pkgconfig:$PWD/../ngtcp2/build/lib/pkgconfig:$PWD/../libbpf/build/lib64/pkgconfig" \ LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/../aws-lc/opt/lib -Wl,-rpath,$PWD/../libbpf/build/lib64" $ make -j$(nproc) The eBPF program ``reuseport_kern.o`` should be found under bpf directory. Pass ``--quic-bpf-program-file=bpf/reuseport_kern.o`` option to nghttpx to load it. See also `HTTP/3 section in nghttpx - HTTP/2 proxy - HOW-TO `_. Unit tests ---------- Unit tests are done by simply running ``make check``. Integration tests ----------------- We have the integration tests for the nghttpx proxy server. The tests are written in the `Go programming language `_ and uses its testing framework. We depend on the following libraries: * golang.org/x/net/http2 * golang.org/x/net/websocket * https://github.com/tatsuhiro-t/go-nghttp2 Go modules will download these dependencies automatically. To run the tests, run the following command under ``integration-tests`` directory: .. code-block:: text $ make it Inside the tests, we use port 3009 to run the test subject server. Migration from v0.7.15 or earlier --------------------------------- nghttp2 v1.0.0 introduced several backward incompatible changes. In this section, we describe these changes and how to migrate to v1.0.0. ALPN protocol ID is now ``h2`` and ``h2c`` ++++++++++++++++++++++++++++++++++++++++++ Previously we announced ``h2-14`` and ``h2c-14``. v1.0.0 implements final protocol version, and we changed ALPN ID to ``h2`` and ``h2c``. The macros ``NGHTTP2_PROTO_VERSION_ID``, ``NGHTTP2_PROTO_VERSION_ID_LEN``, ``NGHTTP2_CLEARTEXT_PROTO_VERSION_ID``, and ``NGHTTP2_CLEARTEXT_PROTO_VERSION_ID_LEN`` have been updated to reflect this change. Basically, existing applications do not have to do anything, just recompiling is enough for this change. Use word "client magic" where we use "client connection preface" ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ We use "client connection preface" to mean first 24 bytes of client connection preface. This is technically not correct, since client connection preface is composed of 24 bytes client magic byte string followed by SETTINGS frame. For clarification, we call "client magic" for this 24 bytes byte string and updated API. * ``NGHTTP2_CLIENT_CONNECTION_PREFACE`` was replaced with ``NGHTTP2_CLIENT_MAGIC``. * ``NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN`` was replaced with ``NGHTTP2_CLIENT_MAGIC_LEN``. * ``NGHTTP2_BAD_PREFACE`` was renamed as ``NGHTTP2_BAD_CLIENT_MAGIC`` The already deprecated ``NGHTTP2_CLIENT_CONNECTION_HEADER`` and ``NGHTTP2_CLIENT_CONNECTION_HEADER_LEN`` were removed. If application uses these macros, just replace old ones with new ones. Since v1.0.0, client magic is sent by library (see next subsection), so client application may just remove these macro use. Client magic is sent by library +++++++++++++++++++++++++++++++ Previously nghttp2 library did not send client magic, which is first 24 bytes byte string of client connection preface, and client applications have to send it by themselves. Since v1.0.0, client magic is sent by library via first call of ``nghttp2_session_send()`` or ``nghttp2_session_mem_send2()``. The client applications which send client magic must remove the relevant code. Remove HTTP Alternative Services (Alt-Svc) related code +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Alt-Svc specification is not finalized yet. To make our API stable, we have decided to remove all Alt-Svc related API from nghttp2. * ``NGHTTP2_EXT_ALTSVC`` was removed. * ``nghttp2_ext_altsvc`` was removed. We have already removed the functionality of Alt-Svc in v0.7 series and they have been essentially noop. The application using these macro and struct, remove those lines. Use nghttp2_error in nghttp2_on_invalid_frame_recv_callback +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Previously ``nghttp2_on_invalid_frame_recv_cb_called`` took the ``error_code``, defined in ``nghttp2_error_code``, as parameter. But they are not detailed enough to debug. Therefore, we decided to use more detailed ``nghttp2_error`` values instead. The application using this callback should update the callback signature. If it treats ``error_code`` as HTTP/2 error code, update the code so that it is treated as ``nghttp2_error``. Receive client magic by default +++++++++++++++++++++++++++++++ Previously nghttp2 did not process client magic (24 bytes byte string). To make it deal with it, we had to use ``nghttp2_option_set_recv_client_preface()``. Since v1.0.0, nghttp2 processes client magic by default and ``nghttp2_option_set_recv_client_preface()`` was removed. Some application may want to disable this behaviour, so we added ``nghttp2_option_set_no_recv_client_magic()`` to achieve this. The application using ``nghttp2_option_set_recv_client_preface()`` with nonzero value, just remove it. The application using ``nghttp2_option_set_recv_client_preface()`` with zero value or not using it must use ``nghttp2_option_set_no_recv_client_magic()`` with nonzero value. Client, Server and Proxy programs --------------------------------- The ``src`` directory contains the HTTP/2 client, server and proxy programs. nghttp - client +++++++++++++++ ``nghttp`` is a HTTP/2 client. It can connect to the HTTP/2 server with prior knowledge, HTTP Upgrade and ALPN TLS extension. It has verbose output mode for framing information. Here is sample output from ``nghttp`` client: .. code-block:: text $ nghttp -nv https://nghttp2.org [ 0.190] Connected The negotiated protocol: h2 [ 0.212] recv SETTINGS frame (niv=2) [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] [ 0.212] send SETTINGS frame (niv=2) [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] [ 0.212] send SETTINGS frame ; ACK (niv=0) [ 0.212] send PRIORITY frame (dep_stream_id=0, weight=201, exclusive=0) [ 0.212] send PRIORITY frame (dep_stream_id=0, weight=101, exclusive=0) [ 0.212] send PRIORITY frame (dep_stream_id=0, weight=1, exclusive=0) [ 0.212] send PRIORITY frame (dep_stream_id=7, weight=1, exclusive=0) [ 0.212] send PRIORITY frame (dep_stream_id=3, weight=1, exclusive=0) [ 0.212] send HEADERS frame ; END_STREAM | END_HEADERS | PRIORITY (padlen=0, dep_stream_id=11, weight=16, exclusive=0) ; Open new stream :method: GET :path: / :scheme: https :authority: nghttp2.org accept: */* accept-encoding: gzip, deflate user-agent: nghttp2/1.0.1-DEV [ 0.221] recv SETTINGS frame ; ACK (niv=0) [ 0.221] recv (stream_id=13) :method: GET [ 0.221] recv (stream_id=13) :scheme: https [ 0.221] recv (stream_id=13) :path: /stylesheets/screen.css [ 0.221] recv (stream_id=13) :authority: nghttp2.org [ 0.221] recv (stream_id=13) accept-encoding: gzip, deflate [ 0.222] recv (stream_id=13) user-agent: nghttp2/1.0.1-DEV [ 0.222] recv PUSH_PROMISE frame ; END_HEADERS (padlen=0, promised_stream_id=2) [ 0.222] recv (stream_id=13) :status: 200 [ 0.222] recv (stream_id=13) date: Thu, 21 May 2015 16:38:14 GMT [ 0.222] recv (stream_id=13) content-type: text/html [ 0.222] recv (stream_id=13) last-modified: Fri, 15 May 2015 15:38:06 GMT [ 0.222] recv (stream_id=13) etag: W/"555612de-19f6" [ 0.222] recv (stream_id=13) link: ; rel=preload; as=stylesheet [ 0.222] recv (stream_id=13) content-encoding: gzip [ 0.222] recv (stream_id=13) server: nghttpx nghttp2/1.0.1-DEV [ 0.222] recv (stream_id=13) via: 1.1 nghttpx [ 0.222] recv (stream_id=13) strict-transport-security: max-age=31536000 [ 0.222] recv HEADERS frame ; END_HEADERS (padlen=0) ; First response header [ 0.222] recv DATA frame ; END_STREAM [ 0.222] recv (stream_id=2) :status: 200 [ 0.222] recv (stream_id=2) date: Thu, 21 May 2015 16:38:14 GMT [ 0.222] recv (stream_id=2) content-type: text/css [ 0.222] recv (stream_id=2) last-modified: Fri, 15 May 2015 15:38:06 GMT [ 0.222] recv (stream_id=2) etag: W/"555612de-9845" [ 0.222] recv (stream_id=2) content-encoding: gzip [ 0.222] recv (stream_id=2) server: nghttpx nghttp2/1.0.1-DEV [ 0.222] recv (stream_id=2) via: 1.1 nghttpx [ 0.222] recv (stream_id=2) strict-transport-security: max-age=31536000 [ 0.222] recv HEADERS frame ; END_HEADERS (padlen=0) ; First push response header [ 0.228] recv DATA frame ; END_STREAM [ 0.228] send GOAWAY frame (last_stream_id=2, error_code=NO_ERROR(0x00), opaque_data(0)=[]) The HTTP Upgrade is performed like so: .. code-block:: text $ nghttp -nvu http://nghttp2.org [ 0.011] Connected [ 0.011] HTTP Upgrade request GET / HTTP/1.1 Host: nghttp2.org Connection: Upgrade, HTTP2-Settings Upgrade: h2c HTTP2-Settings: AAMAAABkAAQAAP__ Accept: */* User-Agent: nghttp2/1.0.1-DEV [ 0.018] HTTP Upgrade response HTTP/1.1 101 Switching Protocols Connection: Upgrade Upgrade: h2c [ 0.018] HTTP Upgrade success [ 0.018] recv SETTINGS frame (niv=2) [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] [ 0.018] send SETTINGS frame (niv=2) [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] [ 0.018] send SETTINGS frame ; ACK (niv=0) [ 0.018] send PRIORITY frame (dep_stream_id=0, weight=201, exclusive=0) [ 0.018] send PRIORITY frame (dep_stream_id=0, weight=101, exclusive=0) [ 0.018] send PRIORITY frame (dep_stream_id=0, weight=1, exclusive=0) [ 0.018] send PRIORITY frame (dep_stream_id=7, weight=1, exclusive=0) [ 0.018] send PRIORITY frame (dep_stream_id=3, weight=1, exclusive=0) [ 0.018] send PRIORITY frame (dep_stream_id=11, weight=16, exclusive=0) [ 0.019] recv (stream_id=1) :method: GET [ 0.019] recv (stream_id=1) :scheme: http [ 0.019] recv (stream_id=1) :path: /stylesheets/screen.css [ 0.019] recv (stream_id=1) host: nghttp2.org [ 0.019] recv (stream_id=1) user-agent: nghttp2/1.0.1-DEV [ 0.019] recv PUSH_PROMISE frame ; END_HEADERS (padlen=0, promised_stream_id=2) [ 0.019] recv (stream_id=1) :status: 200 [ 0.019] recv (stream_id=1) date: Thu, 21 May 2015 16:39:16 GMT [ 0.019] recv (stream_id=1) content-type: text/html [ 0.019] recv (stream_id=1) content-length: 6646 [ 0.019] recv (stream_id=1) last-modified: Fri, 15 May 2015 15:38:06 GMT [ 0.019] recv (stream_id=1) etag: "555612de-19f6" [ 0.019] recv (stream_id=1) link: ; rel=preload; as=stylesheet [ 0.019] recv (stream_id=1) accept-ranges: bytes [ 0.019] recv (stream_id=1) server: nghttpx nghttp2/1.0.1-DEV [ 0.019] recv (stream_id=1) via: 1.1 nghttpx [ 0.019] recv HEADERS frame ; END_HEADERS (padlen=0) ; First response header [ 0.019] recv DATA frame ; END_STREAM [ 0.019] recv (stream_id=2) :status: 200 [ 0.019] recv (stream_id=2) date: Thu, 21 May 2015 16:39:16 GMT [ 0.019] recv (stream_id=2) content-type: text/css [ 0.019] recv (stream_id=2) content-length: 38981 [ 0.019] recv (stream_id=2) last-modified: Fri, 15 May 2015 15:38:06 GMT [ 0.019] recv (stream_id=2) etag: "555612de-9845" [ 0.019] recv (stream_id=2) accept-ranges: bytes [ 0.019] recv (stream_id=2) server: nghttpx nghttp2/1.0.1-DEV [ 0.019] recv (stream_id=2) via: 1.1 nghttpx [ 0.019] recv HEADERS frame ; END_HEADERS (padlen=0) ; First push response header [ 0.026] recv DATA frame [ 0.027] recv DATA frame [ 0.027] send WINDOW_UPDATE frame (window_size_increment=33343) [ 0.032] send WINDOW_UPDATE frame (window_size_increment=33707) [ 0.032] recv DATA frame ; END_STREAM [ 0.032] recv SETTINGS frame ; ACK (niv=0) [ 0.032] send GOAWAY frame (last_stream_id=2, error_code=NO_ERROR(0x00), opaque_data(0)=[]) Using the ``-s`` option, ``nghttp`` prints out some timing information for requests, sorted by completion time: .. code-block:: text $ nghttp -nas https://nghttp2.org/ ***** Statistics ***** Request timing: responseEnd: the time when last byte of response was received relative to connectEnd requestStart: the time just before first byte of request was sent relative to connectEnd. If '*' is shown, this was pushed by server. process: responseEnd - requestStart code: HTTP status code size: number of bytes received as response body without inflation. URI: request URI see http://www.w3.org/TR/resource-timing/#processing-model sorted by 'complete' id responseEnd requestStart process code size request path 13 +37.19ms +280us 36.91ms 200 2K / 2 +72.65ms * +36.38ms 36.26ms 200 8K /stylesheets/screen.css 17 +77.43ms +38.67ms 38.75ms 200 3K /javascripts/octopress.js 15 +78.12ms +38.66ms 39.46ms 200 3K /javascripts/modernizr-2.0.js Using the ``-r`` option, ``nghttp`` writes more detailed timing data to the given file in HAR format. nghttpd - server ++++++++++++++++ ``nghttpd`` is a multi-threaded static web server. By default, it uses SSL/TLS connection. Use ``--no-tls`` option to disable it. ``nghttpd`` only accepts HTTP/2 connections via ALPN or direct HTTP/2 connections. No HTTP Upgrade is supported. The ``-p`` option allows users to configure server push. Just like ``nghttp``, it has a verbose output mode for framing information. Here is sample output from ``nghttpd``: .. code-block:: text $ nghttpd --no-tls -v 8080 IPv4: listen 0.0.0.0:8080 IPv6: listen :::8080 [id=1] [ 1.521] send SETTINGS frame (niv=1) [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] [id=1] [ 1.521] recv SETTINGS frame (niv=2) [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] [id=1] [ 1.521] recv SETTINGS frame ; ACK (niv=0) [id=1] [ 1.521] recv PRIORITY frame (dep_stream_id=0, weight=201, exclusive=0) [id=1] [ 1.521] recv PRIORITY frame (dep_stream_id=0, weight=101, exclusive=0) [id=1] [ 1.521] recv PRIORITY frame (dep_stream_id=0, weight=1, exclusive=0) [id=1] [ 1.521] recv PRIORITY frame (dep_stream_id=7, weight=1, exclusive=0) [id=1] [ 1.521] recv PRIORITY frame (dep_stream_id=3, weight=1, exclusive=0) [id=1] [ 1.521] recv (stream_id=13) :method: GET [id=1] [ 1.521] recv (stream_id=13) :path: / [id=1] [ 1.521] recv (stream_id=13) :scheme: http [id=1] [ 1.521] recv (stream_id=13) :authority: localhost:8080 [id=1] [ 1.521] recv (stream_id=13) accept: */* [id=1] [ 1.521] recv (stream_id=13) accept-encoding: gzip, deflate [id=1] [ 1.521] recv (stream_id=13) user-agent: nghttp2/1.0.0-DEV [id=1] [ 1.521] recv HEADERS frame ; END_STREAM | END_HEADERS | PRIORITY (padlen=0, dep_stream_id=11, weight=16, exclusive=0) ; Open new stream [id=1] [ 1.521] send SETTINGS frame ; ACK (niv=0) [id=1] [ 1.521] send HEADERS frame ; END_HEADERS (padlen=0) ; First response header :status: 200 server: nghttpd nghttp2/1.0.0-DEV content-length: 10 cache-control: max-age=3600 date: Fri, 15 May 2015 14:49:04 GMT last-modified: Tue, 30 Sep 2014 12:40:52 GMT [id=1] [ 1.522] send DATA frame ; END_STREAM [id=1] [ 1.522] stream_id=13 closed [id=1] [ 1.522] recv GOAWAY frame (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[]) [id=1] [ 1.522] closed nghttpx - proxy +++++++++++++++ ``nghttpx`` is a multi-threaded reverse proxy for HTTP/3, HTTP/2, and HTTP/1.1, and powers http://nghttp2.org and supports HTTP/2 server push. We reworked ``nghttpx`` command-line interface, and as a result, there are several incompatibles from 1.8.0 or earlier. This is necessary to extend its capability, and secure the further feature enhancements in the future release. Please read `Migration from nghttpx v1.8.0 or earlier `_ to know how to migrate from earlier releases. ``nghttpx`` implements `important performance-oriented features `_ in TLS, such as session IDs, session tickets (with automatic key rotation), OCSP stapling, dynamic record sizing, ALPN, forward secrecy and HTTP/2. ``nghttpx`` also offers the functionality to share session cache and ticket keys among multiple ``nghttpx`` instances via memcached. ``nghttpx`` has 2 operation modes: ================== ======================== ================ ============= Mode option Frontend Backend Note ================== ======================== ================ ============= default mode HTTP/3, HTTP/2, HTTP/1.1 HTTP/1.1, HTTP/2 Reverse proxy ``--http2-proxy`` HTTP/3, HTTP/2, HTTP/1.1 HTTP/1.1, HTTP/2 Forward proxy ================== ======================== ================ ============= The interesting mode at the moment is the default mode. It works like a reverse proxy and listens for HTTP/3, HTTP/2, and HTTP/1.1 and can be deployed as a SSL/TLS terminator for existing web server. In all modes, the frontend connections are encrypted by SSL/TLS by default. To disable encryption, use the ``no-tls`` keyword in ``--frontend`` option. If encryption is disabled, incoming HTTP/1.1 connections can be upgraded to HTTP/2 through HTTP Upgrade. On the other hard, backend connections are not encrypted by default. To encrypt backend connections, use ``tls`` keyword in ``--backend`` option. ``nghttpx`` supports a configuration file. See the ``--conf`` option and sample configuration file ``nghttpx.conf.sample``. In the default mode, ``nghttpx`` works as reverse proxy to the backend server: .. code-block:: text Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1, HTTP/2) --> Web Server [reverse proxy] With the ``--http2-proxy`` option, it works as forward proxy, and it is so called secure HTTP/2 proxy: .. code-block:: text Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy [secure proxy] (e.g., Squid, ATS) The ``Client`` in the above example needs to be configured to use ``nghttpx`` as secure proxy. At the time of this writing, both Chrome and Firefox support secure HTTP/2 proxy. One way to configure Chrome to use a secure proxy is to create a proxy.pac script like this: .. code-block:: javascript function FindProxyForURL(url, host) { return "HTTPS SERVERADDR:PORT"; } ``SERVERADDR`` and ``PORT`` is the hostname/address and port of the machine nghttpx is running on. Please note that Chrome requires a valid certificate for secure proxy. Then run Chrome with the following arguments: .. code-block:: text $ google-chrome --proxy-pac-url=file:///path/to/proxy.pac --use-npn The backend HTTP/2 connections can be tunneled through an HTTP proxy. The proxy is specified using ``--backend-http-proxy-uri``. The following figure illustrates how nghttpx talks to the outside HTTP/2 proxy through an HTTP proxy: .. code-block:: text Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/2) -- --===================---> HTTP/2 Proxy (HTTP proxy tunnel) (e.g., nghttpx -s) Benchmarking tool ----------------- The ``h2load`` program is a benchmarking tool for HTTP/3, HTTP/2, and HTTP/1.1. The UI of ``h2load`` is heavily inspired by ``weighttp`` (https://github.com/lighttpd/weighttp). The typical usage is as follows: .. code-block:: text $ h2load -n100000 -c100 -m100 https://localhost:8443/ starting benchmark... spawning thread #0: 100 concurrent clients, 100000 total requests Protocol: TLSv1.2 Cipher: ECDHE-RSA-AES128-GCM-SHA256 Server Temp Key: ECDH P-256 256 bits progress: 10% done progress: 20% done progress: 30% done progress: 40% done progress: 50% done progress: 60% done progress: 70% done progress: 80% done progress: 90% done progress: 100% done finished in 771.26ms, 129658 req/s, 4.71MB/s requests: 100000 total, 100000 started, 100000 done, 100000 succeeded, 0 failed, 0 errored status codes: 100000 2xx, 0 3xx, 0 4xx, 0 5xx traffic: 3812300 bytes total, 1009900 bytes headers, 1000000 bytes data min max mean sd +/- sd time for request: 25.12ms 124.55ms 51.07ms 15.36ms 84.87% time for connect: 208.94ms 254.67ms 241.38ms 7.95ms 63.00% time to 1st byte: 209.11ms 254.80ms 241.51ms 7.94ms 63.00% The above example issued total 100,000 requests, using 100 concurrent clients (in other words, 100 HTTP/2 sessions), and a maximum of 100 streams per client. With the ``-t`` option, ``h2load`` will use multiple native threads to avoid saturating a single core on client side. .. warning:: **Don't use this tool against publicly available servers.** That is considered a DOS attack. Please only use it against your private servers. If the experimental HTTP/3 is enabled, h2load can send requests to HTTP/3 server. To do this, specify ``h3`` to ``--alpn-list`` option like so: .. code-block:: text $ h2load --alpn-list h3 https://127.0.0.1:4433 For nghttp2 v1.58 or earlier, use ``--npn-list`` instead of ``--alpn-list``. HPACK tools ----------- The ``src`` directory contains the HPACK tools. The ``deflatehd`` program is a command-line header compression tool. The ``inflatehd`` program is a command-line header decompression tool. Both tools read input from stdin and write output to stdout. Errors are written to stderr. They take JSON as input and output. We (mostly) use the same JSON data format described at https://github.com/http2jp/hpack-test-case. deflatehd - header compressor +++++++++++++++++++++++++++++ The ``deflatehd`` program reads JSON data or HTTP/1-style header fields from stdin and outputs compressed header block in JSON. For the JSON input, the root JSON object must include a ``cases`` key. Its value has to include the sequence of input header set. They share the same compression context and are processed in the order they appear. Each item in the sequence is a JSON object and it must include a ``headers`` key. Its value is an array of JSON objects, which includes exactly one name/value pair. Example: .. code-block:: json { "cases": [ { "headers": [ { ":method": "GET" }, { ":path": "/" } ] }, { "headers": [ { ":method": "POST" }, { ":path": "/" } ] } ] } With the ``-t`` option, the program can accept more familiar HTTP/1 style header field blocks. Each header set is delimited by an empty line: Example: .. code-block:: text :method: GET :scheme: https :path: / :method: POST user-agent: nghttp2 The output is in JSON object. It should include a ``cases`` key and its value is an array of JSON objects, which has at least the following keys: seq The index of header set in the input. input_length The sum of the length of the name/value pairs in the input. output_length The length of the compressed header block. percentage_of_original_size ``output_length`` / ``input_length`` * 100 wire The compressed header block as a hex string. headers The input header set. header_table_size The header table size adjusted before deflating the header set. Examples: .. code-block:: json { "cases": [ { "seq": 0, "input_length": 66, "output_length": 20, "percentage_of_original_size": 30.303030303030305, "wire": "01881f3468e5891afcbf83868a3d856659c62e3f", "headers": [ { ":authority": "example.org" }, { ":method": "GET" }, { ":path": "/" }, { ":scheme": "https" }, { "user-agent": "nghttp2" } ], "header_table_size": 4096 } , { "seq": 1, "input_length": 74, "output_length": 10, "percentage_of_original_size": 13.513513513513514, "wire": "88448504252dd5918485", "headers": [ { ":authority": "example.org" }, { ":method": "POST" }, { ":path": "/account" }, { ":scheme": "https" }, { "user-agent": "nghttp2" } ], "header_table_size": 4096 } ] } The output can be used as the input for ``inflatehd`` and ``deflatehd``. With the ``-d`` option, the extra ``header_table`` key is added and its associated value includes the state of dynamic header table after the corresponding header set was processed. The value includes at least the following keys: entries The entry in the header table. If ``referenced`` is ``true``, it is in the reference set. The ``size`` includes the overhead (32 bytes). The ``index`` corresponds to the index of header table. The ``name`` is the header field name and the ``value`` is the header field value. size The sum of the spaces entries occupied, this includes the entry overhead. max_size The maximum header table size. deflate_size The sum of the spaces entries occupied within ``max_deflate_size``. max_deflate_size The maximum header table size the encoder uses. This can be smaller than ``max_size``. In this case, the encoder only uses up to first ``max_deflate_size`` buffer. Since the header table size is still ``max_size``, the encoder has to keep track of entries outside the ``max_deflate_size`` but inside the ``max_size`` and make sure that they are no longer referenced. Example: .. code-block:: json { "cases": [ { "seq": 0, "input_length": 66, "output_length": 20, "percentage_of_original_size": 30.303030303030305, "wire": "01881f3468e5891afcbf83868a3d856659c62e3f", "headers": [ { ":authority": "example.org" }, { ":method": "GET" }, { ":path": "/" }, { ":scheme": "https" }, { "user-agent": "nghttp2" } ], "header_table_size": 4096, "header_table": { "entries": [ { "index": 1, "name": "user-agent", "value": "nghttp2", "referenced": true, "size": 49 }, { "index": 2, "name": ":scheme", "value": "https", "referenced": true, "size": 44 }, { "index": 3, "name": ":path", "value": "/", "referenced": true, "size": 38 }, { "index": 4, "name": ":method", "value": "GET", "referenced": true, "size": 42 }, { "index": 5, "name": ":authority", "value": "example.org", "referenced": true, "size": 53 } ], "size": 226, "max_size": 4096, "deflate_size": 226, "max_deflate_size": 4096 } } , { "seq": 1, "input_length": 74, "output_length": 10, "percentage_of_original_size": 13.513513513513514, "wire": "88448504252dd5918485", "headers": [ { ":authority": "example.org" }, { ":method": "POST" }, { ":path": "/account" }, { ":scheme": "https" }, { "user-agent": "nghttp2" } ], "header_table_size": 4096, "header_table": { "entries": [ { "index": 1, "name": ":method", "value": "POST", "referenced": true, "size": 43 }, { "index": 2, "name": "user-agent", "value": "nghttp2", "referenced": true, "size": 49 }, { "index": 3, "name": ":scheme", "value": "https", "referenced": true, "size": 44 }, { "index": 4, "name": ":path", "value": "/", "referenced": false, "size": 38 }, { "index": 5, "name": ":method", "value": "GET", "referenced": false, "size": 42 }, { "index": 6, "name": ":authority", "value": "example.org", "referenced": true, "size": 53 } ], "size": 269, "max_size": 4096, "deflate_size": 269, "max_deflate_size": 4096 } } ] } inflatehd - header decompressor +++++++++++++++++++++++++++++++ The ``inflatehd`` program reads JSON data from stdin and outputs decompressed name/value pairs in JSON. The root JSON object must include the ``cases`` key. Its value has to include the sequence of compressed header blocks. They share the same compression context and are processed in the order they appear. Each item in the sequence is a JSON object and it must have at least a ``wire`` key. Its value is a compressed header block as a hex string. Example: .. code-block:: json { "cases": [ { "wire": "8285" }, { "wire": "8583" } ] } The output is a JSON object. It should include a ``cases`` key and its value is an array of JSON objects, which has at least following keys: seq The index of the header set in the input. headers A JSON array that includes decompressed name/value pairs. wire The compressed header block as a hex string. header_table_size The header table size adjusted before inflating compressed header block. Example: .. code-block:: json { "cases": [ { "seq": 0, "wire": "01881f3468e5891afcbf83868a3d856659c62e3f", "headers": [ { ":authority": "example.org" }, { ":method": "GET" }, { ":path": "/" }, { ":scheme": "https" }, { "user-agent": "nghttp2" } ], "header_table_size": 4096 } , { "seq": 1, "wire": "88448504252dd5918485", "headers": [ { ":method": "POST" }, { ":path": "/account" }, { "user-agent": "nghttp2" }, { ":scheme": "https" }, { ":authority": "example.org" } ], "header_table_size": 4096 } ] } The output can be used as the input for ``deflatehd`` and ``inflatehd``. With the ``-d`` option, the extra ``header_table`` key is added and its associated value includes the state of the dynamic header table after the corresponding header set was processed. The format is the same as ``deflatehd``. Contribution ------------ [This text was composed based on 1.2. License section of curl/libcurl project.] When contributing with code, you agree to put your changes and new code under the same license nghttp2 is already using unless stated and agreed otherwise. When changing existing source code, do not alter the copyright of the original file(s). The copyright will still be owned by the original creator(s) or those who have been assigned copyright by the original author(s). By submitting a patch to the nghttp2 project, you (or your employer, as the case may be) agree to assign the copyright of your submission to us. .. the above really needs to be reworded to pass legal muster. We will credit you for your changes as far as possible, to give credit but also to keep a trace back to who made what changes. Please always provide us with your full real name when contributing! See `Contribution Guidelines `_ for more details. Versioning ---------- In general, we follow `Semantic Versioning `_. We may release PATCH releases between the regular releases, mainly for severe security bug fixes. We have no plan to break API compatibility changes involving soname bump, so MAJOR version will stay 1 for the foreseeable future. License ------- The MIT License PK8hZ>~:##!share/nghttp2/fetch-ocsp-responsenuȯ#!/usr/bin/env python # -*- coding: utf-8 -*- # nghttp2 - HTTP/2 C Library # Copyright (c) 2015 Tatsuhiro Tsujikawa # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # This program was translated from the program originally developed by # h2o project (https://github.com/h2o/h2o), written in Perl. It had # the following copyright notice: # Copyright (c) 2015 DeNA Co., Ltd. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. from __future__ import unicode_literals import argparse import io import os import os.path import re import shutil import subprocess import sys import tempfile # make this program work for both Python 3 and Python 2. try: from urllib.parse import urlparse stdout_bwrite = sys.stdout.buffer.write except ImportError: from urlparse import urlparse stdout_bwrite = sys.stdout.write def die(msg): sys.stderr.write(msg) sys.stderr.write('\n') sys.exit(255) def tempfail(msg): sys.stderr.write(msg) sys.stderr.write('\n') sys.exit(os.EX_TEMPFAIL) def run_openssl(args, allow_tempfail=False): buf = io.BytesIO() try: p = subprocess.Popen(args, stdout=subprocess.PIPE) except Exception as e: die('failed to invoke {}:{}'.format(args, e)) try: while True: data = p.stdout.read() if len(data) == 0: break buf.write(data) if p.wait() != 0: raise Exception('nonzero return code {}'.format(p.returncode)) return buf.getvalue() except Exception as e: msg = 'OpenSSL exited abnormally: {}:{}'.format(args, e) tempfail(msg) if allow_tempfail else die(msg) def read_file(path): with open(path, 'rb') as f: return f.read() def write_file(path, data): with open(path, 'wb') as f: f.write(data) def detect_openssl_version(cmd): return run_openssl([cmd, 'version']).decode('utf-8').strip() def extract_ocsp_uri(cmd, cert_fn): # obtain ocsp uri ocsp_uri = run_openssl( [cmd, 'x509', '-in', cert_fn, '-noout', '-ocsp_uri']).decode('utf-8').strip() if not re.match(r'^https?://', ocsp_uri): die('failed to extract ocsp URI from {}'.format(cert_fn)) return ocsp_uri def save_issuer_certificate(issuer_fn, cert_fn): # save issuer certificate chain = read_file(cert_fn).decode('utf-8') m = re.match( r'.*?-----END CERTIFICATE-----.*?(-----BEGIN CERTIFICATE-----.*?-----END CERTIFICATE-----)', chain, re.DOTALL) if not m: die('--issuer option was not used, and failed to extract issuer certificate from the certificate') write_file(issuer_fn, (m.group(1) + '\n').encode('utf-8')) def send_and_receive_ocsp(respder_fn, cmd, cert_fn, issuer_fn, ocsp_uri, ocsp_host, openssl_version): # obtain response (without verification) sys.stderr.write('sending OCSP request to {}\n'.format(ocsp_uri)) args = [ cmd, 'ocsp', '-issuer', issuer_fn, '-cert', cert_fn, '-url', ocsp_uri, '-noverify', '-respout', respder_fn ] ver = openssl_version.lower() if ver.startswith('openssl 1.0.') or ver.startswith('libressl '): args.extend(['-header', 'Host', ocsp_host]) resp = run_openssl(args, allow_tempfail=True) return resp.decode('utf-8') def verify_response(cmd, tempdir, issuer_fn, respder_fn): # verify the response sys.stderr.write('verifying the response signature\n') verify_fn = os.path.join(tempdir, 'verify.out') # try from exotic options allextra = [ # for comodo ['-VAfile', issuer_fn], # these options are only available in OpenSSL >= 1.0.2 ['-partial_chain', '-trusted_first', '-CAfile', issuer_fn], # for OpenSSL <= 1.0.1 ['-CAfile', issuer_fn], ] for extra in allextra: with open(verify_fn, 'w+b') as f: args = [cmd, 'ocsp', '-respin', respder_fn] args.extend(extra) p = subprocess.Popen(args, stdout=f, stderr=f) if p.wait() == 0: # OpenSSL <= 1.0.1, openssl ocsp still returns exit # code 0 even if verification was failed. So check # the error message in stderr output. f.seek(0) if f.read().decode('utf-8').find( 'Response Verify Failure') != -1: continue sys.stderr.write('verify OK (used: {})\n'.format(extra)) return True sys.stderr.write(read_file(verify_fn).decode('utf-8')) return False def fetch_ocsp_response(cmd, cert_fn, tempdir, issuer_fn=None): openssl_version = detect_openssl_version(cmd) sys.stderr.write( 'fetch-ocsp-response (using {})\n'.format(openssl_version)) ocsp_uri = extract_ocsp_uri(cmd, cert_fn) ocsp_host = urlparse(ocsp_uri).netloc if not issuer_fn: issuer_fn = os.path.join(tempdir, 'issuer.crt') save_issuer_certificate(issuer_fn, cert_fn) respder_fn = os.path.join(tempdir, 'resp.der') resp = send_and_receive_ocsp( respder_fn, cmd, cert_fn, issuer_fn, ocsp_uri, ocsp_host, openssl_version) sys.stderr.write('{}\n'.format(resp)) # OpenSSL 1.0.2 still returns exit code 0 even if ocsp responder # returned error status (e.g., trylater(3)) if resp.find('Responder Error:') != -1: raise Exception('responder returned error') if not verify_response(cmd, tempdir, issuer_fn, respder_fn): tempfail('failed to verify the response') # success res = read_file(respder_fn) stdout_bwrite(res) if __name__ == '__main__': parser = argparse.ArgumentParser( description= '''The command issues an OCSP request for given server certificate, verifies the response and prints the resulting DER.''', epilog= '''The command exits 0 if successful, or 75 (EX_TEMPFAIL) on temporary error. Other exit codes may be returned in case of hard errors.''') parser.add_argument( '--issuer', metavar='FILE', help= 'issuer certificate (if omitted, is extracted from the certificate chain)') parser.add_argument('--openssl', metavar='CMD', help='openssl command to use (default: "openssl")', default='openssl') parser.add_argument('certificate', help='path to certificate file to validate') args = parser.parse_args() tempdir = None try: # Python3.2 has tempfile.TemporaryDirectory, which has nice # feature to delete its tree by cleanup() function. We have # to support Python2.7, so we have to do this manually. tempdir = tempfile.mkdtemp() fetch_ocsp_response(args.openssl, args.certificate, tempdir, args.issuer) finally: if tempdir: shutil.rmtree(tempdir) PK8hZ`ffinclude/nghttp2/nghttp2.hnu[PK8hZEEinclude/nghttp2/nghttp2ver.hnu[PK8hZL @lib/libnghttp2.so.14.28.0nuȯPK8hZ*plib/libnghttp2.lanuȯPK8hZ!uulib/pkgconfig/libnghttp2.pcnu[PK8hZrHVVPlib/libnghttp2.anu[PK8hZ+q+qshare/man/man1/nghttpx.1nu[PK8hZOMG==Yshare/man/man1/h2load.1nu[PK8hZL[0#0#N[share/man/man1/nghttp.1nu[PK8hZm~share/man/man1/nghttpd.1nu[PK8hZgshare/doc/nghttp2/README.rstnu[PK8hZ>~:##!Vshare/nghttp2/fetch-ocsp-responsenuȯPK %y