ÿò>÷½3ö=ªWÈJ�©ôÆæUÓ  ËÂÍ¶Ôå�@ªf=.ð½DÐ*ñ‚Ç¡IÖ¦�N€¾¶á90ˆ9‹ù°î¿ Y†…Q Kè�¯µ·�Á”Ñ÷¥Î	ùfê™€á¡F¾× £ì4°LQ*Éú�D‘àÃLï¢$4ŽÎ8í
Dÿ…þU/gÈ¾Ñy>7ö%Ø8QÔ7v¼KS,7-·d0 �>áTžìÊeÂ‡ ‰‡OZˆÙPÊ¤&O­,Ã¹ôÝÄÚôp-qÅ“Ø¹M Ý�¸£E˜JQ˜3wçëKù¼áÍ°*ÿT†ŠÉf	Á_<‹þf ˆßI5¸iv»Ë <”4›DwåÊcæ“JÌ�¹ÚHáB�+�Z=¶ÆÉ�g*;¥4t�‘0ÈTRÔðG}n�qhƒ›pm¡xü;'æP#+ ,qOamP>À1¡·9ÙµH8éö®/’ë¯Æ›C:Xâ@ìËt$^N•¿ƒ[Ó�‰Š�1Cw¸”§Ž_C6ËAÅõ	š#œf<	ÚCwüpà³R±@à5Þ\/œ"R‰’x`äî‡4È�”S9{”Ëmâ³ÉJö“ÍæN®Ø°§wXUU{è)¢þwu¬9…ƒÅK½à)Å; ß�<»¦ØÜ¿KmscÁÕ,Ê-B8o[Œ3¢�¤|—Â)ºÔL)vsÕèžO÷AlmHæu}P·ƒJÐy~mAØÈAö[“Èî@vkc-¥¥ T&ý^(þt»"hIñÉ»X?WºzµJ»£¥ög¯ãƒ�ì�£ˆ²B´v‘ï[´™žm(?€®i}Úô4ÇÏô,G‡æ÷Rêd‡žà E5`Âb'�Ÿ^õë�Ô Ýó!Þ!M‚Cgí)Ë£eÊ3QˆG¤‚4J«‰o?þ¡'Ö¿4ïi|G¡¥IúdB)½°ðhÔÏM["<³úAJg0(Ãˆ]W�gÝµä0nxÔ¾ÛÔcX#¤û1¦¢Žï7žêÓª¦úî¿�œ7\÷ïëÌŽCS—ƒÄ¬b$Š­´¦ÔF�Í¸Ÿ.»Ò&ÆN-!�úµ8zïÞáÿ•<Ý>V\üÁ8§ÙÇ€aÚ9Œ‹`0Y~jÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþFKŒÛl“+ñPaõå]ÓDò£íôÞÐ‚ Ö¸±ËÓÇ_zÌƒ°ÜYUpý…�3›�Ð/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÁ)ÿ8fQW‰]e÷ÁNëËÅYÊšhVž½& £r@Š.°L9ãÅíCßœ£Å�ZLä–.ØV€Ü�—n|Ô:ë·híG¥Ý³I¾fiÅ,�‚ÂÚHÄûŒŠýkŽ¦ã�Åù
Ý7Ñ¶]_ŽæQszvø–þ
’ug!ìUç/dÀ´ÙV…d fo`8Öz^&¶ ‚ Õó¬F.«�?&º˜¾4MO¦H�=6%‚ûzhKãj«5© jffÃRË�®Ð/Aþˆƒ‡A÷&¤mþ®2ß¢ÃTWsì’z
‡¯LÃ|<ÿ{Õx•÷2Az¿´­®ŽkÕþ2aüöM×¶©üD¦N1îv¤i¶Nºy�~ü2scÀ+0gb"óeÉHôäQ<U	7;$Êq)ªüìf#ã;â‹Ò•šrc‘;™—Žÿd9Ï±qä«&è¯º“YâuVm¥JF<G;ƒÖg	�†tèò‚úúc'µQ.ms¢Óá¾ñórÁj‰˜}á}1˜�@hõV†Á9®ÊÍ†äÍžYvFá€°Ê<U	fð]ÎLÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÛ[q‰¸ö+øWF�¥ˆ#Ý=(ˆ­*Í	öaÍM»H­�¶H©Îyx�úºÒ%ixñëTå\ u®‰z«:sxšq@·´%×mh~�ñØåá@„ÂwXô®¤U®Ò\7•®kH6G:‡JÔ#¹hX‚ÙPr9Ð/Aþˆƒ‡A÷&¤mþCi^³²�#EPõ_Q	C“¯†i«ÂUT+l¯*ïîª\¤«b†¸’�Â²R‚‹ÐßpªN1øågŠL8,*ˆz!™†ìô´ž>S»Ør¬RæR¿’À(0§,hZE`n¥;Ñô–�ÉÍÇQþrqœI€…–™Ë8? uÃ]¬¨Á"ž#KâoFˆø}t˜wÊÜLs&  -J&@;ýv¼àä#t}Rñ{�w?^½Ñ	=ì÷Œñ&“ýožãÔ>¯MŒ3˜²]»tKç±¨Yr˜u§KU}Jè�ì«Dï+ŽÉ˜Cõ)BÒµ²A?.j™a÷Ð/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþyõWQ~T}K�÷ÆˆÏ3Ž‹òH˜—”�Ÿüê½ý…/+3'ØAvì¶Ä¾uÆÒ�›ÌŸúqØ'ø¯;ÛÝ»8öÿ_;íÄùÇs¶éôQÎö/Ý¦²×\‹¥Ýb€z<yH6G:‡JÔ#¹hX‚ÙPr9Ð/Aþˆƒ‡A÷&¤mþ’À(0§,hZE`n¥ŠË†Ôü.½Qš€ËúÙØß­#—KÒMüÄ'À‚”¤Zn¯ÂR­ö½´¶�ÓdEqh¬g–‹£Q*6\Ð/Aþˆƒ‡A÷&¤mþ�výÄKN¿Ï‘ÔB%[t›™;=åÈR4‡AÝ/fh(Åõª‘¢±ÝêW~ÕeïÀº¤ŸEuØ4>ç¹L–Š1‡¬ÔÂ†“îÞ¸Àâ#…ÈR«§c…ŽÝYÅóŸ�s³èG¶MM˜ÄÐ*çVŸ*™–ß~Š�n?¥ýáDçñ~Ý¯BAÐwòÊ|;¦îgÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþîP‘„©"ÑrZ/Î9o^Gly*ß½“LýÚÃ×Ç;dNQr‰„{# S—\7ªdÍÕ:AÚ).‘ p2ò/\5ÖngAúµ£ŠÂ£Û�S®š‚¥ÿ<í¨jm…Ý_(¾BhKãj«5© jffÃRË�®Ð/Aþˆƒ‡A÷&¤mþWì=:MÚ Œ ZHüw¬Û+GƒjÌ¥ëoN—æEI¯Y§ã)<·ÅYØ‰eI‡V7Ð!Ò� ¹¯_Ï·	( µy�~ü2scÀ+0gb"óeŸR’—*=9�âK\rÛÍ�8†Eø�Øk^^ ËíZåx0Ü^ú¸nTì6ù…�Ž¦R¬FÔÊãø^02E6|ï°“jùù�kmË·híG¥Ý³I¾fiÅ,�‚ÂÚHÄûŒŠýkŽ¦ã�Åù
Ý7Ñ¶]_Žæ`³oÏÏ&™~–çfvVzàYtªÀ90«/›'Ð/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþéìÓºS6¦¶ˆŽˆ§u—wÀ—QÈRdža‘|fDl…àf°û xä1%EžÂAäxà+—ùÆv‰Š´¯!pH±pµ;ŸïÃBµ¸U»´„X»2(Q¼õ ¨î4I˜¦º«ƒ&�Ýûø"¬m­,�Þ2f‚ŠÐ/Aþˆƒ‡A÷&¤mþò-a“§H i¡:ímýÃf�Yiô²8ô„d(Z©3u™8&�-úJÞ�i'šFê9hÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþ’À(0§,hZE`n¥ŠË†Ôü.½Qš€Ë<ò‹—¢þ{Œ‡RˆC9ûTM¸tW ÔßÖåV™áÙÑ·Æ¥Åq)–VË¿ „Ð/Aþˆƒ‡A÷&¤mþ¼K¬º‹[K]Ý}Jñ÷tBKÚðn¡”Œ3Ÿúqúëc�ëE�Ù‹5�L©IMäÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþ‡õ²šQ_<Ý¾q|$*òù5bcÇ4;zV¨¯¨{ô—Í:��ešm[ì³þV_Ñ8c1á[§}âÓ§5ÓÒ¡ûÐO@Nk° øV[ÚÄàsÀƒ^ë2ê¾�<Ë’Å»q7g,�iÄ€EØ!¨Þ­�`è™¼û£ÁèòÍ_¥µQszvø–þ
’ug!ìUìL‘ˆ<ÿL‹“( Ûp}×LÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþ’À(0§,hZE`n¥§OæFá1`ÊÏêÜûm_Ìv)ÃˆÑû}Õ¥ÑóA@»È{˜]8Z$¡¢çµÂÁÁdÀñWÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþò	ÅpmÓDU/ŸisYO°4•ÎÌ´�KÎQÿà§ºYP	Ð˜RE°–TLkD“¥'ªw'ékD=«ˆñÌ÷Ð/Aþˆƒ‡A÷&¤mþWì=:MÚ Œ ZHüw¬žgË‡ÍvÎ%VdW�K|Ð/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÁuÙ£N	HŸÌ ˜~Jƒ'€¥rÚÚ©‘q_œØš8]ùí¹«.¸sƒ*Ð/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþosŽ-(GÍ˜f¦i˜rÂ{<�¡6î@Û%TÚäiò#;’ÕvrN3Ód[%!øV„Ð/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþŸþÙ­~¥ŽVzŸò›Ý"’±D©;N8øU‰Œ#0Í‡tÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþÐ/Aþˆƒ‡A÷&¤mþCi^³²�#EPõ_Q	C ðð$Ív6ªñ	PÄ	—Ð!Ò� ¹¯_Ï·	( µy�~ü2scÀ+0gb"óeÐ/Aþˆƒ‡A÷&¤mþò-a“§H i¡:ímýÃf�JÍ¹<Y€ÉêmHùˆøp®¯Ú1<ªI–>©Y÷ŸÃu$Ø’Y#?ê…%‚axDxÐ/Aþˆƒ‡A÷&¤mþ’À(0§,hZE`n¥äþ”æjçv^JnðÈM€¨I†hB|´1¸w¨‰©óë¤©×pzYÞ{¦P–Bäp’Ñ|€ÃL“)é2Òqô¢¤$Ð/Aþˆƒ‡A÷&¤mþ\
        }                                                                      \
    }                                                                          \
    else {                                                                     \
        Napi::TypeError::New(env, "Argument " #i " must be an integer").ThrowAsJavaScriptException(); \
        return env.Null(); \
    }


#define DEFINE_CONSTANT_INTEGER(target, constant, name)                        \
    Napi::PropertyDescriptor::Value(#name, Napi::Number::New(env, constant),   \
        static_cast<napi_property_attributes>(napi_enumerable | napi_configurable)),

#define DEFINE_CONSTANT_STRING(target, constant, name)                         \
    Napi::PropertyDescriptor::Value(#name, Napi::String::New(env, constant),   \
        static_cast<napi_property_attributes>(napi_enumerable | napi_configurable)),

#define EXCEPTION(msg, errno, name)                                            \
    Napi::Value name = Napi::Error::New(env,                                   \
        StringConcat(                                                          \
            StringConcat(                                                      \
                Napi::String::New(env, sqlite_code_string(errno)),             \
                Napi::String::New(env, ": ")                                   \
            ),                                                                 \
            (msg)                                                              \
        ).Utf8Value()                                                          \
    ).Value();                                                                 \
    Napi::Object name ##_obj = name.As<Napi::Object>();                        \
    (name ##_obj).Set( Napi::String::New(env, "errno"), Napi::Number::New(env, errno)); \
    (name ##_obj).Set( Napi::String::New(env, "code"),                         \
        Napi::String::New(env, sqlite_code_string(errno)));


#define EMIT_EVENT(obj, argc, argv)                                            \
    TRY_CATCH_CALL((obj),                                                      \
        (obj).Get("emit").As<Napi::Function>(),\
        argc, argv                                                             \
    );

// The Mac OS compiler complains when argv is NULL unless we
// first assign it to a locally defined variable.
#define TRY_CATCH_CALL(context, callback, argc, argv, ...)                     \
    Napi::Value* passed_argv = argv;\
    std::vector<napi_value> args;\
    if ((argc != 0) && (passed_argv != NULL)) {\
      args.assign(passed_argv, passed_argv + argc);\
    }\
    Napi::Value res = (callback).Call(Napi::Value(context), args);             \
    if (res.IsEmpty()) return __VA_ARGS__;

#define WORK_DEFINITION(name)                                                  \
    Napi::Value name(const Napi::CallbackInfo& info);                          \
    static void Work_Begin##name(Baton* baton);                                \
    static void Work_##name(napi_env env, void* data);                         \
    static void Work_After##name(napi_env env, napi_status status, void* data);

#ifdef DEBUG
    #define ASSERT_STATUS() assert(status == 0);
#else
    #define ASSERT_STATUS() (void)status;
#endif

#define CREATE_WORK(name, workerFn, afterFn)                                    \
    int status = napi_create_async_work(env, NULL, Napi::String::New(env, name),\
                             workerFn, afterFn, baton, &baton->request);        \
                                                                                \
    ASSERT_STATUS();                                                            \
    napi_queue_async_work(env, baton->request);

#define STATEMENT_BEGIN(type)                                                  \
    assert(baton);                                                             \
    assert(baton->stmt);                                                       \
    assert(!baton->stmt->locked);                                              \
    assert(!baton->stmt->finalized);                                           \
    assert(baton->stmt->prepared);                                             \
    baton->stmt->locked = true;                                                \
    baton->stmt->db->pending++;                                                \
    auto env = baton->stmt->Env();                                             \
    CREATE_WORK("sqlite3.Statement."#type, Work_##type, Work_After##type);

#define STATEMENT_INIT(type)                                                   \
    type* baton = static_cast<type*>(data);                                    \
    Statement* stmt = baton->stmt;

#define STATEMENT_MUTEX(name) \
    if (!stmt->db->_handle) { \
        stmt->status = SQLITE_MISUSE; \
        stmt->message = "Database handle is closed"; \
        return; \
    } \
    sqlite3_mutex* name = sqlite3_db_mutex(stmt->db->_handle);

#define STATEMENT_END()                                                        \
    assert(stmt->locked);                                                      \
    assert(stmt->db->pending);                                                 \
    stmt->locked = false;                                                      \
    stmt->db->pending--;                                                       \
    stmt->Process();                                                           \
    stmt->db->Process();

#define BACKUP_BEGIN(type)                                                     \
    assert(baton);                                                             \
    assert(baton->backup);                                                     \
    assert(!baton->backup->locked);                                            \
    assert(!baton->backup->finished);                                          \
    assert(baton->backup->inited);                                             \
    baton->backup->locked = true;                                              \
    baton->backup->db->pending++;                                              \
    auto env = baton->backup->Env();                                           \
    CREATE_WORK("sqlite3.Backup."#type, Work_##type, Work_After##type);

#define BACKUP_INIT(type)                                                      \
    type* baton = static_cast<type*>(data);                                    \
    Backup* backup = baton->backup;

#define BACKUP_END()                                                           \
    assert(backup->locked);                                                    \
    assert(backup->db->pending);                                               \
    backup->locked = false;                                                    \
    backup->db->pending--;                                                     \
    backup->Process();                                                         \
    backup->db->Process();

#endif