pax_global_header00006660000000000000000000000064152140054210014504gustar00rootroot0000000000000052 comment=128a9b482dd34ea6185298d335de2c8d3f378d4c korean_lunar_calendar_py-0.4.0/000077500000000000000000000000001521400542100165265ustar00rootroot00000000000000korean_lunar_calendar_py-0.4.0/.gitignore000066400000000000000000000000611521400542100205130ustar00rootroot00000000000000korean_lunar_calendar.egg-info/ *.pyc *.swp *.eggkorean_lunar_calendar_py-0.4.0/LICENSE000066400000000000000000000020671521400542100175400ustar00rootroot00000000000000Copyright (c) 2018-2026 Jinil Lee 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. korean_lunar_calendar_py-0.4.0/README.md000066400000000000000000000125661521400542100200170ustar00rootroot00000000000000

korean_lunar_calendar

Convert between the Korean lunar calendar (�력) and the Gregorian solar calendar (양력) — entirely offline, following the KARI (Korea Astronomy and Space Science Institute) standard.

PyPI version MIT license Zero dependencies Live demo

> The Korean and Chinese lunar calendars share the same astronomical basis but can fall on > different dates. This library uses the Korean (KARI) standard. ## Features - **Two-way conversion** — solar → lunar and lunar → solar. - **Offline** — the conversion table is bundled; no network calls, no external services. - **GapJa (ê°„ì§€) strings** — the sexagenary year/month/day in both Korean (정유년 병오월) and Chinese (ä¸�酉年 丙å�ˆæœˆ). - **Leap-month aware** — handles intercalation months (윤달) and the 1582 Gregorian reform gap. - **Input validation** — every setter returns a `bool`; out-of-range, non-integer, and impossible-leap-month dates are rejected. - **Pure standard library** — no third-party dependencies. ## Supported range | Calendar | From | To | | ------------ | ------------ | ------------ | | Lunar (ì�Œë ¥) | `1000-01-01` | `2050-11-18` | | Solar (ì–‘ë ¥) | `1000-02-13` | `2050-12-31` | Dates outside this range cause the corresponding setter to return `False`. ## Install ```bash pip install korean_lunar_calendar ``` ```python from korean_lunar_calendar import KoreanLunarCalendar ``` ## Usage ### Solar → Lunar (ì–‘ë ¥ → ì�Œë ¥) ```python calendar = KoreanLunarCalendar() # setSolarDate(year, month, day) -> bool calendar.setSolarDate(2017, 6, 24) print(calendar.LunarIsoFormat()) # 2017-05-01 Intercalation print(calendar.getGapJaString()) # 정유년 병오월 임오ì�¼ (윤월) print(calendar.getChineseGapJaString()) # ä¸�酉年 丙å�ˆæœˆ 壬å�ˆæ—¥ (é–�月) ``` ### Lunar → Solar (ì�Œë ¥ → ì–‘ë ¥) ```python calendar = KoreanLunarCalendar() # setLunarDate(year, month, day, isIntercalation) -> bool calendar.setLunarDate(1956, 1, 21, False) print(calendar.SolarIsoFormat()) # 1956-03-03 print(calendar.getGapJaString()) # 병신년 ê²½ì�¸ì›” 기사ì�¼ # Intercalation (leap) month, e.g. lunar 1727-03-01 (leap) -> solar 1727-04-21 calendar.setLunarDate(1727, 3, 1, True) print(calendar.SolarIsoFormat()) # 1727-04-21 print(calendar.getGapJaString()) # 정미년 ê°‘ì§„ì›” 정사ì�¼ (윤월) ``` > Always check the return value of `setSolarDate` / `setLunarDate` before reading the result — > the accessors reflect the **last successful** set call. ## API `KoreanLunarCalendar()` creates a stateful converter. Set a date, then read it back in the other calendar. | Member | Returns | Description | | ------ | ------- | ----------- | | `setSolarDate(year, month, day)` | `bool` | Set a Gregorian date. Returns `False` for out-of-range, non-integer, or nonexistent dates. | | `setLunarDate(year, month, day, isIntercalation)` | `bool` | Set a lunar date. `isIntercalation` requests the leap month; returns `False` if that month has no leap month. | | `LunarIsoFormat()` | `str` | Lunar date as `YYYY-MM-DD`, with ` Intercalation` appended for a leap month. | | `SolarIsoFormat()` | `str` | Solar date as `YYYY-MM-DD`. | | `getGapJaString()` | `str` | Sexagenary cycle in Korean, e.g. `정유년 병오월 임오ì�¼ (윤월)`. | | `getChineseGapJaString()` | `str` | Sexagenary cycle in Chinese characters, e.g. `ä¸�酉年 丙å�ˆæœˆ 壬å�ˆæ—¥ (é–�月)`. | After a successful set you can also read the components directly: `lunarYear`, `lunarMonth`, `lunarDay`, `isIntercalation`, `solarYear`, `solarMonth`, `solarDay`. ## Validation Every setter validates its input and returns a `bool`, so you can branch on the result: ```python calendar = KoreanLunarCalendar() # Rejected -> returns False calendar.setLunarDate(99, 1, 1, False) # before supported range calendar.setSolarDate(2051, 1, 1) # after supported range calendar.setSolarDate(2017, 6, 24.5) # non-integer input calendar.setSolarDate(1582, 10, 8) # skipped by the 1582 Gregorian reform calendar.setLunarDate(2017, 3, 1, True) # month 3 of 2017 has no leap month # Accepted -> returns True calendar.setLunarDate(1000, 1, 1, False) calendar.setSolarDate(2050, 12, 31) ``` ## Tests ```bash python -m unittest -v ``` ## Other languages - **Java** — [usingsky/KoreanLunarCalendar](https://github.com/usingsky/KoreanLunarCalendar) - **Python** — [usingsky/korean_lunar_calendar_py](https://github.com/usingsky/korean_lunar_calendar_py) - **JavaScript** — [usingsky/korean_lunar_calendar_js](https://github.com/usingsky/korean_lunar_calendar_js) ## Acknowledgements Conversion data follows the [KARI (Korea Astronomy and Space Science Institute)](https://astro.kasi.re.kr/) Korean lunar–solar standard. Many thanks to KARI for publishing the reference tables. ## License MIT © [Jinil Lee](https://github.com/usingsky) korean_lunar_calendar_py-0.4.0/dist/000077500000000000000000000000001521400542100174715ustar00rootroot00000000000000korean_lunar_calendar_py-0.4.0/dist/korean_lunar_calendar-0.3.1-py3-none-any.whl000066400000000000000000000215111521400542100274060ustar00rootroot00000000000000PKaP0U ÔœúWx!korean_lunar_calendar/__init__.pyK+ÊÏUÐËÎ/JMÌ‹Ï)ÍK,ŠONÌIÍKI,RÈÌ-È/*QðKú€äœ¡R¼\¼\ññe©EÅ™ùyññ ¶ êzÆz†ê‰Äœ°`´‚:Íê ±¼\PKŒU0Uµžú˜Mâc.korean_lunar_calendar/korean_lunar_calendar.pyÍ]ëoܶ²ÿ ÿƒ�ƒ^Ø�]H”HIEçÕºM�ƒ8=¸E¥MöÔÞ-v7=õ—û·_¾DÉáú‘âÜëÝ]‰â gæ7/r·+Ž¿>.Äz\®>~[|Þ-Ž;uåჇ=zôðÁOëÍÄW¯?¯øæ9¿œV#ß<|ðô™Šå¶àÅårØðÍu±[Ë9VL›]až(.Õ#ÇÂ>£|¿™>®7Kyo¾úÍ<¿»RðÕX<ÿ´\MÛÉ_”¤¶üj2súËÃç]ñ‰ÿ1ãr±�,­vÅÈw“œõÝ'ùÈb}y¹þw±û4?�¼==Ð¤Š“ín³^­¯®5©óß¹˜Šs±œVòõtµÝ-wŸwÓáÃçŸwŸÖ›B e+e³ýíúï¯øòò±¾²²yø`yõûzc¨î–WÓÃâ’o·"´ƒõð¯Iì‹o>(äßOoÞ¾<9»xýËÙÉÛ‹ŸOÏ.þyòú——Å“¢*å_UVذ“ÿvÃHI˪ªº`Øù›×Øl¤ª±añl¤¶DÒÏNÎ_^üúòä­�Ó 1™/N~½xqúê•ÐÔpsûüç“ׯ/~~söî5TÑìáýg§ßw뀄yZÑŸo3 ï«§ƒ»LiÇß——Ïåõ÷uuT�î¨P¯u½"×Hÿ!Æó^¾9ûþäLÍUþÉE%Ç”жiÔë F󹫨þ<Ôú:ŸÔ|jü0êûd*Ís�¹/DÒ‘$~<5DDÛ›ÁcOÍCmg&¯ô«è…žD”\èWF 3â ‰óJÌëHÛ„è?~<¹øåìô�¡Ìr}þÃéÙKi¡DZZ5´™ho^+ûZjÉ0RrõJÇ…þL§^îý ?w“^DËÚîCHˆ„´´³›Y¡ECk¶0³ ¥¥R›ë�k‰¦&¹Ô×ûªé-WÂÌÇiB5” �ÚÆLUš)éD�LNÏÞ½|ûüäõÉ»Ó7eïÞÎ4éi·pct½8yw¢Æš[óŸ\¬ä´Õ‹"‹IP2˜÷¢)G³=f¤Æ6ê²ì)ÝÊü˜ž™ër mFkˆrLÆóf¹ë¢oÝxÖX& "¥’ТæýLŒ³�¹•1æ%DØdÇT¬'“»nßkb¢gnõÚF­�“œYŸJB«€vö�®Ù,ƪ'Ì‹‘P/‰ž8QSÎ�¨áÁ–’&ÕÆ)]Ä&ª�R¯‚f¼Ø©#&‘ÖzcÆËzg°uKSµÖe-øà¯“6eÂXïàÄØqêEÍ�a*¤8ƒ¥÷;ÂÔ.«‘ƒõ¨‘Z`6¡,9„�%ÖŽ\„ê ¶¡ÆxD�1Ø™° ómíQCQt”=o^Œ Ð1wĤ½öÞ`¡xG·zÂÏh_[tHßÓô­»®PƒJÂChê¬.…A õÐÌ:n8D ÷è˜Xå‚júsVBš0›W_1Ú{@:ˆ×1áÔ3PÃ9ð1j0�Ù 4qPÂö^� -Ðk‚¡�1E�^} lK/‚VÎÒ>ò4@Ç6¾H/ê¦ñ¢¶¨ÑPŸz’Äš5]?d?A�%ì˜& ≠ÔÙ �!Æ;£‹¬éÓÀ3›YCã�ó¨êáǬñéÎ~¥êzû:f)b õ¨Œ{# PcÓ;µúÀ3²$¾h¨ )iÔcΊ‚ Y4h>!#üà®SšÄíæûÆoÈ )Xì c•žÐ3V½$šÑI¨'trãyнz䄃MY0Ÿð¨‘&áÕó�•µ”$¨ÑÌM}íÐǰ( !¤ gpb'4E�’ ‡H™cM×’ÍNÏ @—!~Bc#x l5"BMˆšCÂ�ƒú¡÷Þ3Z±{Ôô 9Ú$„[&Ô@¸ª…ÕË @HˆÞ‚µ²nê`>ÁfÛ"2!‡ÉŒ/)6â%)š˜#ž/I 댫õ³jå îÐ5x¶Ý¯ßŸÏG]>ùÕƒ¬¬á)jŒÓ›ý„ʶIÆ&&ê Ä™ðb„¨™ íæykŒÁ:µ6ck£Ã(ie²m¡ÁéµêauE)4XÇåUk@V¦CüÄC¸b61ù¨;jXó `¼6+3ÙvŠ=?¼Šj2ù„ƒPG ¨{�yû˜Ž€Ø@R§$ç!“yoÝ¿³-i÷:25¤Ð>X5"jâ¹G‡mkh¨Ë„"ñsŒ¦wM¿Ø'j]gÊìV†rXkÅ\r4ôÄÏ�ú‰(naZ6¦¡\{=š:(£VŸW™¸ãXÝ‘dÃÄ¡ƒBÅÇÔ))bb€Ê»yjVú ë‡0u´ÐzaÝBym=cì g µ‡¡¼ò¥å¹£×+•…¦÷ h\‘ˆš§>VÀ��ÁzÔHu· Ž>B§ä XÓ  ˆ;W•}/"Ôô0°±Á;C…,vPZ'5dPä(†ÂXàPÃa¡ #5:Äs¢Ϭ|(¯Œøü/h¨ÔPŠÕÁÊáÎ×™MP³·¡PÃ8h¨ p•BTéµáÀ ˜‰¨:Ä3ÞÇâ�`é`C 0W»˜Ò5x(÷ž±naRêPS ¶5 bÔ——-¯Ô§Wy7?buG!›!jLC�&¨!jö4Ô�Pnã}Ê5C¾ºR 5�OxÔÜ¢¡V5,B æ1AwÍž°ÖØ×PsËàbF4®ˆ„î1}­aºkNÔA…Ž7Ô2 pÐP [8:ªŠ¶1á½ 5æ;ÀŒOŠACÍ«•ÀË'Tçeh@€ñµF€šÖºÞ Ö„ pY×i:®kˆ’b&Ÿð¸Am9€|¢Æ4Ô(DMZ䘆š—\ÜPër`½­ïOt¹xlqC�ܲ¡†¡£gÐçãùDØPÊœ¤¡æÝØû‚X/À„ÊÖn¢t5a>o¢` 5âÁbjzåmQ&bYb4Wkäj5‚ƒÎ�PƒyÌ®§Bɼ“ôz̃›(l¨¹¶¡‹/Êcr5ÔPI„Ý5��ïÞ µÁì‡ íæD÷5Ô2ÙvŸ¶L¶ j°îð{cU÷ݰ1!žúl;FM*‰ÅÄ8p>S*ª¿¬¡Vèx¶í�¥cx@ëÙ4ÔRÔGÜ|ØPóû&ØF\xÔv÷F˜M”5¶¡kWPw€†ÚÜòÓ”_èM$ðÀÌ[¯TT5=ƒ ìäj̧‰5¸Ÿ€Ý5Šž6ÔxŠš´¡Ö¤0àæÇ :ÂîšB¹†Ú¼dfG™ù†šG�¡…ç5¶“£B<>«Ï5Ôz ÖlC­I·$åä¤~÷†ÌM®¨À)ï�šð“jß$éò_憾ç!¤»kóÃóNNØòQ›(i¬�é  rù.O&Û!d&"�.aCÍ£†…9iÚPÓµ l¶ LØîˆx TT °éët'¤ƒ"Þ7#³ýQ$Ÿt¬«(�Oð5"ÞDAN ؆Zk4-$åׯØ-—Oì)læ°ÌÓ«4ÖDp­i„4Ÿ tÏS6 ŸÀëÕ†Á0P+ˆ/µÚæDÑ ÔŽ ó¥£o”Ê— F„õª\=~¾¦•^,ÇDî¤D :öº§H¬��M1ÄÔ`’P… O,9Þ^¦|-ž EÃO TÝØ„¨Áó ïÁI´å#Ì& (àAŸ•Õ$G5U‹žÀ 4ãž×éND èòˆ5ª–�ùD˜•aè`Í" ö<)¯<´8Ì aË'ÚD)æ=3¨>¼ËÃHŸÉ'ðF©¬Y�|ÖŽŽG�ÒY÷”ÂÚ5ì�b±ƒ2,Ÿ…²ÞÕI¥&¹��£;ÊÒ$XØåA%á‹Wu†*Óòq:–é?Þ(m›2j¾7JÇ\AŒ´|hù˜IÑ­l•þà :pRÛ¼±õ*¦Ž6aË'9CäªpŠ¥5>Ÿ ÖÛZÔdê ö5j$Ÿ0ë[>@�ð 0ƒê ·9]µ.¥›ñ˜Ð‚âµæ)jL×¾»)Ÿp»FQ>a eTHËG€-$$ŸðAŽ�i¬‰êÕ&Þ¼Á÷E�g\Èô?i”jÜOØ ÄORžoœO4*+»)ŸèÂ|—oÈI#9XwxUÒfLz£.mÀv~jŽ7Jeaã™°¨ ¶”îûÜ®Ñ\(û.�¾>eÎÞñà�'÷]~xRn_<Ÿ ‚'¨ 2oµàl> $E�4J!j4±i”†ù„;(œ6e1�Yëƒ=4&¬qOÚ½�R½«[…™z5éòà{åCx¢|‚Rä(SØå‘ÙvfûºçÐÍߘO¨¦ <Ê„ž<¤#OPQ�« r¹|?yH‡5†9_¯Ê93]¯VB#Ô Ý;FC9û’-Ÿ”°†z—¢F;:Ñ…¨Áó !6véöBÔ¡mÒ(õ*ìòˆ5m>Ÿh°|¢¢þœ8y(àÉvÕãJ·¯µ£ëÓX3£Ͷù”˜yƒ–räÑ!¨nSÔèÂæ(9ØEо’Êur†ÊëFêw”a—gô»�lÏn Z¼&_±Äd‚ R7¼ËÆ6�5{vÑ} ä†QËÇ£¦ìؘƚ0ÈI7�×Ý{FW­~B,”•å·�góê[>¤±&B� r¹|ýrHU#¨1[H°Á>À# ÞÑÅ'!- Í€ž¨åC`>P 5&ÛN› §‹¢m.lDØ(�¶¯Ô8'ÆÆ2�5ú½?•@G¬Ëo<#Ö¡U=׿ŽÃ ~7�àxýŒš¹PF{ÛÝÀ>À/wŽÓ¢¸¸X®–»‹‹ƒít¹8üÖ?§>£¿³ûëÄ7Å“¢Äîý¼^í>ån¾à×È­åötµ›6‚_òÝr½’#^ñËí4·Î�Û®/³´õ½m}ÓÑŽn^\|ä¿ÿ‹«yOWêïøIÁÉ?à5‘`d•))ãˆþº —´þFñévýj½¹â»DÞêkÈç;µØG_I}ü• ‰ú?�Š¯ŠƒPG±ŽB©úi— \ê߆2S,ÉÁÈG~àfÚ}Þ¬æ±pmçJäùµÙ³ sª>ŠÕ{ªô•rŸv¯Í’w\ÏtT\ËYÒz–äk›ïÕèâ¹ë¾2ý§ˆHsjé_Îü L¸›ÅÓ§EE‹ÿ’Ð,ËòUnY×[°¬£âJzr¶^I)T_…4=­'ÎL¡¸´  <¤¥èùÕöWë]¡&Ô_³�MÞ�ÌHÎq�àûIñnóy:ÔsD¬ rôT�j–#2Æb¯·óÒ°o¡+V�WÌÊ»:,že1I§�¾äRTƒÿ &ŠƒŠHƒ3«º'?/–�ÈÀÚ™À«Wˆ¯·y«{6-Ö›éßN •hY¢ÀýʇŠÁ>T,Wņ¯>N{Ðe&}\Å ÖS?F Wb&pxï5A¼`%˜Ú¿X¥[í?ž>Ùç@¬ÝhI=ÇK�ef¢™Ze™Jes“|ÌŠÜ”G&¼P·ìg�ŠÐ[&0M½JÆ%¢~ç!¡\GJFIÌx¡ôÞw³ˆŽo'¥tÒ#ã¬î`['ÃwÔGê¡ÛÂ_@5ë±ô�÷�5R,Wv=òII,4Þ/uÔyíf÷͹ möF-,·&÷€ìŸµ7‡î².œ(ûÜæ ¹�|�à ´‘†^ÜÅëÙü¯È­Ló¼”;1ú³T³âQÖ0¯™ï8Èvó�<üšËœ}Þ�‘ð‡cnI§¥ÿ!ÌÐC²¦L»ÝÚnjö­! 3¹¥¨ Ørö{ͽN2§bÌIfE8ÉÄ=jšÇ�]‡?”t ÅmõÝôìzÆþ“)y`7Wp{Ã7²K}Ë,Ô;O*ÚLÕ�+¸sµ6˜Æ7”£š™ÿ.ÖRÂüci˜êßCëÀ HJYõUdÑDWàJ±‘E[êÏ®Ó$&4K_‘Z«¬¢œ®Ef€áÄ ÝD†zÖÌ#Ïyòã˜éÇUúܰ™øo{[(îý¾VŠÿ�ë©Ìƒ^(¸DæîlüÙµ³|kî°Â‡Åý\×ß`Ý9Ý sEa8^¬¹ †c‡&%™£Ô|÷¸ŠÈ! Á›aÙ>Ø<à¯7ñœ“˜M<Í»¬¥g 1ó@ 3÷yÁóKÇ4H21¬á¾Yë¨P¢Š Õ¢h�Þ»ùè*uÎ28ÝñÐâÝû}�[ÿ!ßÁuo“…gºÑ•ÐQˆO“øíŸür9ÿ°Üjá$‹ßŸ,·zž:ªE)o}žä-5Á×ú§¥ õ<êSñÿVÑŽ|STå7-þ§ðŸªfÎÊÿP´üWËÕL"MýÏ8ê:[/ä·øO>‚¹ùŸ{æv¿ýx‹¹ç±q§ofþ»'@Xªpp¤ŸÂ;iŸÏ54ÌS¶ ¯jýQŠVßÂ[¯—WË^÷†U`‚tÁhbz%¥€óy†'Öl4Ǻ“#¯(Ń©+è2ì\f¡�[´”Í W6[´†‹�Ëô>V¼ÅmÀ—V­›u‘3€”�ƒs…ŒÆÏADÃÀß䶸 ¨}Ј\ˆâñ7p;·ñŸá¸}>4úQdÔ�>ôKš2QÐôì"œä —/¨*0[Ã--²¬/È#ïnGzœÍ�n&cê6w8n_ÖŽ4öão\kxþ}ëlù~JÒ¶ö=ÿýGžlûÝX§ÞmWó…JØFs^|�íß÷åµkñ!Sv¸Wð°øª¸œVA_hþ1]TÙ*C¶¼YýÓºÍð“ŽdÏןW.ææ©‚ )¾Žwžoà/¿ôyÝŠR*ê{ŠÓÍY¥sV÷“Uº¡ož ëqÑÜ“[;]MGö1êa6ƒì|·Y®>¨A ÷3XŒhêóÑ¡þ)‚½/>mнÇaóáð¨ˆÑL£ã«Ìøùç™Ñ‡ˆzȯâV +»‡À„îÀ¢{ê><:³º‡ÎlîÀŸ}FqoñãÙ†q÷±Çt†£O…([9 �%ùÑl¹¬ýlVÓVñL(î}æoÿÇÿÄ¿�~?v~¤¿S~' ìå1‡„<“9(ÜÀå�XØË&†<“8n`ñÿÕM|Þ€‡ÿPK¡U0UÈÿ—t�J-korean_lunar_calendar-0.3.1.dist-info/LICENSE]R_o›0Gâ;œúÔI¬ëú4MÓ4œÆdœfy$àoGØ,Ê·ßIÛuR$ä»ûý»Kl�çÁì[·õ;x¸ÿøéýÃýÃ=|7½é Õ¾ŒÎô{÷ûüm¨LwWÛÃ×0ƒB㜱=­ôö û¡ê½n"Ø µ;¨ÛjØë¼…ª?ÃQvë+è÷PA�ÂG}‹<Îîü©4N7P9gkS!!4¶º÷•'Á�é´ƒ[ßj¸)¯ˆ›w“J£«. LÔ|îÁÉøÖŽíü`j"‰Àôu76äâ¹Ý™ƒ¹J|ZŒ ¤† «lcvôÕS²ã¸íŒk#h qoG�EGÅZ÷„Â$ìNwh ) ZŸâ¾ú›†Èý‘–ê¯krT9µöð6‹AG»qèQTO ÆâÚ&Í_ºöT¡ù�í:{¢tµíC¡Üg:œÂfµµô”çrüÞz´{qAg8¾÷ÚrmÕu°Õ×­¡2î¸ú7Ò@œÇ?€©:8Úa’ü?êÝdaÁ¡ÌçjÍ$QB!ó'‘ðnX‰ï›ÖB-ò•œ�,SÈçÀ² üYÿYH^–�Ë0Ë"‹"‹ÓU"²G˜!0ˤb)²ªHñÊ%xIlK.ã>ÙL¤Bm¢0˜ •ë<—À `R‰x•2 ÅJyÉÑ@‚¼™Èæeø’gêe±ü P.Xš’V°�dâ¼ØHñ¸P°ÈÓ„cqÆÑ›¥ü¢…¹â”‰e [²G>¡r¤Áx4w1ë§)2üÅJä%‰óLI|FTªìZ”<&EI;™Ë|‰i§É'füBCû†7gÁz¯Jþ g)’•žR>OãUÿPK¡U0UÍž£iªÝ .korean_lunar_calendar-0.3.1.dist-info/METADATAÕU]oE}ß_q%^Ö’×ñÚÊŠ"¬|´nœ¦ª/¢‰=¶WÙÝYíÎ&ò JQ"‘òÑ4 ŠD*^Œ ¥)‚~ 5^ÿ‡Þ™õÚÞ6.á‘‘×Ú½sî¹wî=33M9©N´�©ç›Ì1 —Ñ•»Ä¦,2�G³‡xZ…XÔ©Oé³™¬‹oAªLÓáøÐ„[ßú×’Y¡Ž�¹Ng•)Ú\f^Õ7 N(¥™–i*cñ}³fŠ8ãt‰Z̵©Ã¡Ì |0 ȃËm�¶èpd£U(U“:* ]¬í¿c'œ*|ä#tdœú‹œ¹ —Yæš+³_&M$‡ö’¹àϤÉHÝ¥ ÀL¹×õØ6d1âé„Ë ¦K8ÊMŸS;òÅœ«ÔY;<¿ç±ºGl[8”ˆSPÂå^ꈷÜÄçã†i“¦…]+Ç&î–'%êÓ\¤§¹ž æ„¢”›Ã‡‚£³}pùôGw6ÃÃ�öÑhŸ­tö‰©™%ê-™tYQ>ëa½M±Æ¦,YÙ&pæ ˜Ç»"¹‡à–GëÌ3‰£(±9#غ=(Áf�5P·Ø›ž£ù¸E#Ú¾y!àÐ KTQªf­†iaÃqsSI<Û@¯³,¶ ¼Aaªp¿¨ÊhPð¹Çf7e´²KPgåJ¤·¢ãs“œ¦ÞPP£‰ðô Ý:wO.Ÿ¶Âýoáòü$<^Iá6h¯w¾:÷7:Z §'Ðþu½³½>ÞÌ ¾ðpôl6Û^[…¬îo‰ÿÃßÑc¥³z¹ì¨œÒå”~§.Ÿo„?¬>Ùv6‡°å¤Kþ*69•×_gSÃÿ€£×·~ÙUA®esšž‡Ï%�¦ç´¼ž‚÷5íƒ!è:éøë9éš~C–Y�XVOgÂæš.˜‘†è[¶™áÁFcOaQ³)0m—¡mV ,/%“A™V)n$Wn©Ø.FÍc6\y*Ç\Ѳäq?6_ÅewW\fÂÇQ€Ð/Ct?H£uéÏ#œ�ÚŸºNj½Dn^•ƒšê#ß—à ‚g14)Na—Si,‚Ã*öß«¤©b¿S¯³g|ÊåDªj.«¿›†wÒ�{;Á?¸šby&™g>q=¼vÔ©Ä}áÔT‚¬[¡[ĽCðAÏúP¢:åÁ^!ŠÏ‹ë2uñ¯Êþ“ûÔ,þiô%Ê¡eG…vÅ å!^¢Mb6<ÚŽÄ–jŸm†�ŽÅ¶ ¿[o¸ëÔð@Xº ÿuþàÅÚ—ÏÁ·½‹¯×ÿ>X‡‹ï[âm÷ ¨/v¾A‹ÌEÍ¥®ÐP_XjS#5EÂ’»–°®/—4îÄ�e‹%µ¶ÂÝ)C´$s–ZÒßE!é¨%|&‰åÓDó×qIIüÿ_R¢*Z6�¿è[Hç¡Ñåéáṑ¸N¾habíìý³u&´sñÛ㋟֤vžý|ñì µ#¢¼PK¡U0Uéh€\\+korean_lunar_calendar-0.3.1.dist-info/WHEEL ÏHMÍÑ K-*ÎÌϳR0Ô3àrOÍK-J,É/²RHJÉ,.‰/©QÐ0Ð36×3Ôä ÊÏ/Ñõ,Ö (-JÍÉL²R()*Må IL·R(¨4ÖÍËÏKÕMÌ«äâPK¡U0Uކ¥â3korean_lunar_calendar-0.3.1.dist-info/top_level.txtËÎ/JMÌ‹Ï)ÍK,ŠONÌIÍKI,âPK¡U0U�@9�e‰,korean_lunar_calendar-0.3.1.dist-info/RECORD�ÍËrª0€á}Ÿ%RB¹„ETÃ¥¢T±»É¡€�„áŽOVΜE;ãö_ümsR ˜¶S�; ˜ÊƒB/RecVIýÜß%w;#®ü>­Ï�ꊒâÜüÖíÏ`Žò †(Nª„îèN@æC8Šº ¼ c¶¸qÕôöûÀ bª!ȈÆ�ŸÒc€¤i…°Æ£ ™�ê AáZtw7÷ÖÚkƒN\ßÛ}«³ÑÞ—Z]ôûRü¬³m÷Æ>@-öZ;ûoƒÝMÐÚy¼ÙÙÙ¨ƒö_\ßkw»`wo©ÒÙ¾¾Õi£‹��õ­��«à 긳»¶:Û�}4êþ.Àã±:í.m»½·~ ýl]éluöß®/U6;û;xÔÍÝ=Ð×[{û�õ[­=pýÆÞõÝn!°�ÆÝéìlî!0ííöÎþ ‹®�ö[èè^kmmaXK•Ö 4�=Œ"Xß½þö^çêµ}pmwk£�.^i#ÜZW¶Úš×úV«³]­íÖÕ6鵋†AÓÃí(‚àg×Úø†ØBëû�Ý<“õÝ�ý=ô³Ž&º·ŸöýY§Û®ƒÖ^§‹i²¹·»�æˆiŠºì’QPÇ�6ÓË‚šàß7ºítD°Ñnm¡Áº¸3™eÒ­jiKKÿ¿ôÿKÿ¿,?ÿ»µÓÙlw÷WÂáwéÿ“ü¯èÿ&ª.ýÿ (±7öÚ­�íöÊd�8ì+-ziÿ/Èþ—û?ߟý/÷Jû_`ÿ¯¿yµ�bÝÝï8ÿgšŠ–Ùÿ1зÒþ_DÙ"èÃ6Þ &8ݳ ´u©²Á*�2ÇR%mJØd©Ò� pr¼ Þ$íÁnÖÓö×Fƒ 1†‡hÄ£(OW/_> ££™‹s‰—“ôâe)´œlÍ¢£Ñd•%%“K�§$WA>E¹TÙ†ág±#»<¯óMÞ­‚íÎþRåÍàøîhâOWA‚V�"['È.UÖûp: {!†µÜ ú£1NV‚n£Ù¬®4@«?>‚bãÎ0Bã>hÍü0zn�€¨¼@ãöÐ7¦¨íå�`z;�Å>û£qèáviú�Ç]ß Ý œ„AVLÜb·Û­ñx2ºƒ@¯’$ÕbŸ]„2ŒpƱ{<�‚íŒÐöƒ1F|‰í¯OF‡8à[px8C,‚û\?Fk;Äß´³vÐÓ¥kl†}´~©3»T¡Köe°wR{³ØRe­¸ Zô÷ìãO~÷Ïàä“O¾øàé—¿O¿½÷ì³_ÓÊÝ;ÁäNÜE_ÿ2.´âZ@2¶‚>!ô1NÏz£!j%òBj$øàW'ÁáhÂ!!¹¾BŒû¤­qÊvýñ3Z¬ô"N¤# ¦#³Ëî,GðN€†ñÃ^¡†xI�½�S¿4oLr¶o¶ö:U´¦Ñd4 Ž Àî"îëz” ;ÃiF³(¨Í¥¨ÒŠ“o<}øèäÓ¯ŸüîáÉçž<úúä«{5$ Oïõìo�|þÁ³_>¸Á7_ƒ§ÿþþ³�ïŸüæ#:¶0âÉ÷€Š,ÈÓ÷îE=ùü#üÿ/þõ¹÷ìþ×@SLR¥’*µ‰ªžüდºÐ?÷ɇÃi¤�.ŽTéªd8ô·ºJ?*é2²%¨b Ek¨:ø²¡j ]­�×�× 8"¿´“ÚP›1½1ýq&>å=zyŽAH«@ïÇËN¶7ÒîôbU©�p€³øxÃcÖØ´VVû·1þ†d³zò_IÿŸG¿üã{ýøÿ†¾}öøoßÿßïƒÇÿøûô· úÇOþ]‰Qªj5 c1nãX°JYŒra¼…¹mqÂ’ÜôñÌžþêáɧ‘þ)â/‚8á/Õ1s©ˆ¿Ð¿MØŸâbò³YˆÍH‡›a5ýÅ0;ýŠ0Ö“oþëä‹G˜±°-ú«‡h5R~úìÿ>úóÓãÿøÍãy�ðÓïÿõñï¿EüDA•ùŸrÿ燲ÿ£áP¹ÿSæHþ‡í |§ùCQì8ÿc–jàü*eþçâÖ_Ï�‰+Åq…‹‡Y8\yþ`˜‹…+/(ΕW¾³ ¸ò‚CàWˆV¹¨è·Âbß Çf‹¾•4ì­°Žù˜·RàâWž7Þ­ ;æ·g‰mÏÚVž;°]€±^TP{Ž˜v��vñˆöÏ’¥¸@v�8v�0¶Rõ(Ï|¯ç?ô|ü¯–ñÿ…Äÿ¶äü‡eèvyüãGÿKë.ŸOþÏvÿ¯­Yzyÿo™ÿ-×ÿÂó¿åùÿRÿÏÕÿá0ŒVÆÇ/&ÿ‹Ô½’æm¬ 4Õ(Ïÿ_L!Ù«•ó¤¯îÐs€` ,–Y¦°ß'o‚eIçep« 8Kû_Úÿ?Aûo*–YÚÿÒþϱÿÒ«s��ùößRmƒ;ÿ¯¢øO3TÓ,íÿE”—Aã•Nô‡ÃÃU0‹z�&¾‚íø¥K—’MÖŒñÎ}\Àm㾈M\�ÛÃ};¸?…ä ¿?€Ðf©{H*V¢KŸV—n¶�ÈÃ9j`•fäßÜÝk·v¶nì´ö¶;;oµ¶n´‘Ϥ�XQeÍZ‘6ÃÛ ªª6…fÝÝ-ÙhȘʚeGÓô¨ô•V·}ðv»µ�I›Ð�h‹�ÖÛ�ÍMÔÀÐùqhuw»µµu°½»³ 7Å0¾þJçªP« ho ?©¶L¾÷j­dë„Ö£Ë]ì�êx/©YøSW2Ÿ’kšsK ÆúµöîÎÕÖKyz*j£¼ëÙ†�?]ϧ¿›ªI~»:¹<nïú¤^ Ú¯Ië=Ïá ot(Ïvhcß1i'»IWɧçxdO�ù´4ŠŒÛkŠÀ4ú©ÑOß´s@¯¿Ñ:¸±ÓÙ§�]•N˳|#†ìÝJèº~­³ÓFmº¬FJ9Ï·œ<%Ș͸CSñ­„Œª£YŒŒšÉ(áh)©M9Rs€] QZS®�†¨+á Õ5M¶†ë2²›)0$i6cFŽy-'eXÝ6ó˪+º]v]³M9% 7%cšŒÔ0eL,))Ú´²RC‘K+ªoq ˤ¨'ã ÌÉ¢ÅÀl_ã®s€]3eXäÌëñRC6ŒÌ¼­3©1¥Ò¡8Ðè12ÜÃâW‡1,O^?�½]†¨£ÇÒ�t�áØ‚ÔH)ÁD(hÆkéQ©áHíÉ�—Ȥ#°Ô!Ÿ“ Nj_¦¬x"€-3EÓaúÀä¤Cck¬AÓçÄ5ed9=‘•™ÆlºfNAy0Ózšksëš“�0c^jÈìmŽ·0óJ¤ÃR":?` n�cû‚Ö¸§F�•"ê�£ålMFjšŽ[ 1n�cÕëQ�Ÿ“špŠ´ÖÓ0×Lùú”‘æM¤Ff;,ÃÉžÄØ$ËáL‰YLj\×dâgÅÌK©›èµép†Ð)’ŽD„00‹c(“I�gAƤ‚ÔÄîž½ ­œ}!¢î!JK5f"Bc£õ ©?�,¼ËIMξ5ïè¼­±û"³¦¯æ �¨UUó% ?¥�£™AÚ楆̞7r–S`;˜±Qt—÷'˜Ô –°9O)¨K¼2ÛÔrRC� =•>KfEy"Œã¦d×̼Ô`ª@^R[#Š«b%J�J 'º”Ú¤¥†Çã [,5^Fjš©!ØHEÝÍH�\O0ͨ™:Gv&5ŽÅ9ÓÈÆ¢h[^NjxqÅÓ›V�tp"äyŽ�3<œÔà™5}nù\ÞŸ°ÞÒ�CÎ;G¾ ®Ro›×ù�yJÄâ1/Êü Û´™Æ4¸e…œÝ13R#÷¶Nëñß9�}&º00sö…¨ù¼ÔP¥—è ìmk<˜:ó¶=7gxˆR‚)ÃZ|0cpþ4æm ¶&EÔõ¬o›‰�›®+>†É!aò ›"dB5ok8¯Œ˜øŠâ*ã Wð'¸¸ƒ“Ëàý Žyc¯ŒzÛy©!ã[®.HM�?‘ŠPSãIí2Øô9`®–WJh- ßcõŸòâû`¾žà•ÑùWC¹l¸�IGœÖ ¢ŽŠœžH`©{g8½y¤&q&²ÁrXˆ58e¥Î‘ëh½ùz"ã Û¼[æçM9Ñzf^AÑee°Zà7¡,îÈyÃZ*&¯  ŸWJ˜çœE%9 :{QOÄzH¶6Ͻ|ÜÁ™r=ÖŒYåA‹síyS®²Ð2Ȩ©tøl]Mh2Ý u€U­É‘jé@_µszB”´Ü¶!—èÃ\�Cf¯»B ɧé5þîe¤Æá ›åjܲZRÛašz.†‚Œ�h R©�| Ì'Fb©!&BQjäž3åºÇÛ“ÓùÏ‘Pã¤Æ4eqG6é›,Î ÌœÔÌM¨qRcA.¡&8Àª+õ¶ È1”E-*1ñtê2?”“¤ø„‡œÎjfFj䦜iFÝæ�ÒTjT7N xY©ÑRX±¡ž“ªôTSH¨Iy‚!�O†H¤†&ÔÌœÔx¢ÔÌI¨ILylï¡Ä)U<]á„çO0©Y ¡¦VFjd“Ë®1Ã#Æój)ÃZüd|©¬jH„ä“Å4»&�Ðå µXH¨‰©¹t¨ªiËü‰Â„šÅ2À  <¡Æ–Uã`™?�3/®ÁkRcǪW°5¢¬èz> ��k4LŲk©ááü‰XjhBÍ„ÙÔ€—I h�“ lBM•sÜk³üD³ÈN [6¡¦-˜P“I‡cA?gxæ&ÔdAN.¡Æ�ïóÊ X*BŠo¢z>¡æž’PC&Ê’-hH«€'²"”¸öE±FqBÍá¼m.›‘™Æl:&'BšÄóîHëY9 ø„Zš6Lí Ö˜PË$Ô¤”³k>·“cžšPsé~¨GÔ|*¢ójnQ~"olˆ·Í%Ôø¸ƒí�©*o¾ã jâÍ'ºóS˜Ôä”OàpÕ K¨‰ºÜÛfÊÊ4}sÞž'M¨™²„RDœšj&—PsäN ïÇ»7ÝDÉIMœPs³Ì›K¨¹š<¡†ãU‰tè”Þó&³ç"*Nj‹WPÃ,¡f17‘J�\OðÙ5Sjx\>¡óR“O¨œ¤Xœš÷ ¤CÌ®ùõÓj.§% v”-–PcR“lsÊü ]¶“ƒM<ät~à˜§&Ôw�„šÑ“QBSL¶{£%I®L:šÐa˜ô¤Þ7Éey<Þ¾$ 5ùF!’]Ëîäˆ)¼‰’·5ù“ÅYžo[¡8+ëBßÍJ�—‘KôIó 5ËðÉ(÷'\‹ó¶Ó l=¿“ùƒ^vßÄÏæ³<òX”ó' Íg^rRãe7Q$'â„ZÞÖX¦4îPµ¦›ËI{ó=5r¶š·5qÕÍŒÔHý !°‘îyâÀ†ó'äñªaYPº¬œ}Ññ6§T:8²}.óÂ'J}–(E6.'5ž¯¢ÙËÏרH‹!QtR€—-(“HË-ÈòĆ #d RãKý ›_KJ·—Mp)˜?Sƒ�ÉO ¨Mß0ÈÞ™²“Ò”�G7Q¸�?èÁ¼2Ýãœ#&5ªí�.ÊŠP"÷PÏïäˆ{ži–Ç¥Ç2®Üȹr�i=sÞIâm›ÜQ¦$QÊïydyHöNؼ)ò'¸=Oª>—yá|C>åsÛ tÏŒ_>y–ÇÒœBž(E1‹ÄŸÈîkÀL¢4Y{ÓäcW17*³¦%ó'ÄÓ ºíH· (CéŽ2b KÌòH)Á‚W|† Î;CEDÑ•'JmÃå‘àj,7júE±$åãq)ŸfvÏ“K/iâwR@¶yÇ«²å0øÀFLùäÎP þœLÉö—åñÈ®‘ÏKMAÜarûºÄŸà÷2Hº™“�9À¿|â6§Ã%Ô 4&¯¹àU‡y©¡YûæiþDºk”ñ'h ,]IÊÇã¶�Š¥dí-ß”î(sñª‘ݼ‘š±‡ÜK–ò±ƒ&·(?yhÂ<ófý {e§ùMÑŸpæ�à³<Ù¤¬iøvá±)ÙÎ�å‰RØ8Y©ñ2a£éèóý .ËC®gï pȲ,?R€ß¾Öäþ„éÁœÔd²<ª^èOp"„H ç¥|0G’(ý‰ô p>)kÊãÍʈP"÷š=7QJvuøTaA¼šËòÈ÷Êݹ‰Rº…$9Ê$fy�·]°}í@^ÍŸêOऊ› d3ñªéÜÔdƒ( Êm��ÓrB~òÐtóRC‘cñ*³ ËÖU33R#ÍÞY¦(Bé³ÒR>yÀDÔ›PvòPµ½¦(5r‚‰�å7óÛ ™ ­¡I¥Y/#5v±?aÈü Õdç$¸“‡ÂÉvœãÊo_EçämM"5RoyÃS�ò‘y´™·�—��¥F~¦Ý’”óg¨L–½3�ìÀôäazGDñnàb7‡¤{åüÉy–ÇrmSº}]°(Ý×ÈÜ"¦|˜Ô(MËÏÛšÌn édÎëÎ=£‹g8sS>DîmA3zÉìmèÝ–Û+ô'¤7‡¨ºDjèŸ`wù# .wNBžå‘¦'G�SïùÑx‚“.°‘J õ¶…Ó&úü3º\`#½9$oäøík¤è”¼­³<ÈîȲüüÉà `Í”‡³‹ŽÃ¹·k¤å�Ã%�²4·Ýt­[üÍ�~ÐÉaªÓ ß«­²~ø÷ ¹g÷í€<„V‘Õm㧆UnÀcIU8ž¥ŠZ�‡ƒòO(%í¦ø�Ÿ°I]ì)}œm ;SyppÇ?‡xÜÎð]r�"ú»%oH€-Õ‚–¢ÐN#· 2Jgž‰›¥7¾ ¹áÉ^ú RÑ�Ÿ “Hþw üTÅÕ¨gW .R�{¤iØ“S}Uä�ú«¼ø¬ÛK¬á$ˆf“aÒ–Ÿ[æá¬Ù¹Å '–.u=»¼uqIk¾a8Š�ÜfŸe¾>ÃFhŒjN¾×ÀþdÔÈXÕ *:2 ⮥Z åØãi25Ù]è�àªÓ[­�×�¤tøî™›ÜEˆ¸ñ‹@TU 1�Õ9ñ‘àã‘a0;°¹)âãi1×] z£IpN,•¢åÔ/êܸ‡`‡‡AuŽtÑA_Uk²ù¼*a\$ €Ú¹çÄË+'X9™š?Y¼¶D¼¾6O�Ä|OE ­svª ͨ5K‰¦ÆHåis}èŒÒ!Ù³·s¢Z ©xaNLóZ¥@%JõNM«Ž<L1ª…òu¯%$’`¼•òƒÖ©²:oµÜ©\Q“ç¨/ÂTü2ˆGm =ñêü¶”ê 5žꉀ‰Ìû¼Šºxu ÷é+2yöÔU§Ô÷àÑãtÖ\s,ªK]ôqn±ã·$šäsß¹¦W®âÉhì¹(7UíYLÚÑ]£ëC-$ge™ááÆ¥ã5o·Øðp½…§¹$Þçù³˜H¦«ô§gÂ�Ñ„IæT`›ۦfÞ2f¦h*Ùh3c¾Öœ«$‹–X¦$ I'(Éœz$0_‹JZ`áø«\9fïÅà yø0.‰àæš Hi—×- QÏ<8ÑDÝEwQ¬Í Ã’XQ%È¿–]¥ò¯ªäõ!j-Ö \…ð ÄÕƒ Gk$Ç ›áèú•ã¼#²%‹Hc®TkùP'™ òÅ�sps4$£´¡ôLod‘~UÍ÷s'¼=7…’~Ÿ—Ja?Šr*I£ ,.vOyüÊ1{¥ew>Âçƒû$®?…»‹ÖF:VÆ gçŸ]¹â P>¤.Ib¥’Ú†š'y2¬0–4xñ,^¤$Ïû]1§2º„Í*°9ó Îè_¦HsN&(pÿó>}Õ¥DÉDùõ‘,4“Þ³éh5¯œ‘qZXâyŽO¿ÏKܲÅÜôknâ ÝÌQQxG�wû-Ø}N?„SBœÜäç»ᔌ“œ¢DU³Uá^!�RD„$ãà_Y‹ÿ²ŠžTe˜à€ýR�Ä+¿ƒa±ƒp˜€È»‡ì1Ž$Φoòbþ­ü‘�ÜØðÝ9c§Ï~\`ì¤m6Ó— ÿÚG,8¤ _çkòy¾4¡A{Źª“Ÿˆ´¤JžºØ aˆs’ �°Ô1dœR!íAGX‹Ù†`L29è ^xnFøŠR¨`zñD�tÒˆfQsÎ[ŒWÞ® ט#à«·lZ‡Ã‹,mܶPE&„u?–ˆh^õ1‰^úvNç,"ÔÌhdTÆ]¢9NÁ"ì,¢?סóô¨¤Õ©:ôy’2£ÉЭI0)\ž#ª�ñZ‘Hœõ~äÙùˆ´‹} ÓAÿœâq/îuËv3™ã-_5¹ÿ½°·|¾E"¼FÞ˜Ûö;5N=Û®f]**b-õðòÆG²ý{S¹…wM2x ×ÀªÍ߬�Ÿ€~0òBÉÃtk§ƒU À*çK­›�)þ"–l}4¦6·Haq-±qÑÀ+Ù�çSð+žz²�“œ‡ôs’3SÍ�©ž�Vù ýᄱ^Æ9±�‡S3Ãióeb–yk)5°š?‰�È"‡�ž-ðð@ø ûðÞÑD:¡›r±¹U«ƒl‚ôM9¿ËÛ'�g–vÒp'î%³‹ ÈqÙbr,tÓ^çÁ1e«Å0LÙæ øÅ}0vÙ-~¹·AÕ}Vc¦ŒCN…T1¯ÔDfÉ=4Mk>šê­Z>UœÊæ>ö—¼j÷»“‚ìÒáaç‹ÈAþ9åg„¹8IB1’E¢p –§ÊÂ\4åÂPŒ¤\NAñ{õ4“üŸéý¿šbã÷?•ïÿ-ßÿW®ÿ¿ÿéÿòý¥þ_@ÿ_ój£³³¹»�üÏyÿ¯i*Üûÿ t]ÓS/ßÿwe;ˆ #Øx‹¾Ìwh+êRe‚U@ !¾Êo©’6%l²TéÎ89^M^ýG÷Ƹ׎Ac шGQ4ž®^¾|FG3¿Kïròz=9»Œ�—*-ò*¾UðF8 û`+’K�¿’Oþоm#ô/;²Ëó:o…^0œ"„·;ûK•7ƒã»£‰?]Mß=X§ÈÖ ²K•uüÚ¿°bXÁ� ?ð뻌fS°º tЭþøŠ�qÔ8ô´f>}áj:¢ò�ÛCܘ¢¶—7‚éíh4ûì�Æ¡‡ÛuG½è.œ~èúyƒcd`ÅÀ-v»Ð�'£;ô*!IR-öÙE(£ðwxºÇÓ(ÐÎm?c㑨þúdt8�ƒî±‡‡3Ä"¸Ïõc´¶CüM;k=]ºÆfØGë·ÕYoïtÉÞ5]²w(ƒ½“rØ;˜Å–*kÅÕ¢¿g?xò»'Ÿ|xòÅO¿ü-xúí½gŸýšVîÞ &wÂà.úú—q¡ÏùªL4{Y&ðE¼0 “}e&ûù_›9�R J+N¾yðôᣓO¿~ò»‡'Ÿÿ=xòè듯îá}‹§÷¿zö7�N>ÿàÙ/Üà›¯ÁÓÿÙÇ÷O~ó[ñä‹{äm”Oß»õäó�ðÿ¿øOÔçÞ³û_“·Zâ*•T©MTõäœüÓ=€þ!Èx¸O>,N#}tÙp¤JW%á¿ÕUú‰s1ù7ž‚*ÐP´†ªƒ_�!ªÖÐÕx­Ñx½€#âN*úK;© µÓÓöûŒ÷èåq8!­¼/ûéÀ íN/V•ZòøÁÈŸõ6­•üÂØ‰Û˜«!'ÍðåÏüBy ‘!¦Ù}xû0²PÃB.VéÊý÷—¨–òDmQStÖ¤/j­qM_cˆÒàätG-->RELP#ljªˆj’ñW„ÍgMÁ�ç²ê@3Dü¤:Ý]@o€äÛŒ'ÈdUÓa3w�ÖÄábR‘ä5 Iîâ¡2[B™¡µ²ðX’üz­–‹›{ÁtÖ�nÅ?1eЉ™[<óE«O¾üøäÁ—Xðž~ûáɯ¿ÂÂwò÷ñ7$›Õ“øJ‚øÿ<úåßûëÇø7ôí³Çûþÿ>x<þLJøÛ§¿Õ?~òwèJŒRU«I‹qÇ‚UÊb”Ûã-Ìm‹³Pæ^"<³§¿zxòéC¤Šø‹­PÉÈð;kÙL ~6 ±Yæ†Ü?{6Ãj(:ú‹/`vúa¬'ßü×É�0ca[ôWÑj¤üôÙÿ}ô-æ§Çÿñ›Çÿòá§ßÿëãß‹ø‰‚*ó?eþ§Ìÿ”åG—ÿéîÞØ[owW¢w£çÊÿ(ªËä,Ã*ó?Qâø¸²ÝÚél¶»û+á°²×nml·W&Ó¨‚\ŒÙxÅëÆßÆÇ)W\NSÜBÎMEÍóiÆÊâìxZÓ$áôÃáíé"}¢Ñø �S'§ó{iÿKû_Úÿ²üÀí¿L‹žËþ+Šš±ÿ&rJû¥õw)íiÿKû_ÚÿsØÿ…#¢Sí¿–�ÿuS1Jûÿ½­)ÿ¥ý¿Hû_žÿÿþì¿ôü¿£Ûš]j�¹ýO“¿/@þçÙU³ÅóÿªaÚåùÏ )7ñÐ[K?˜z“pŒ4za?:†màt7‘ïw€}?Ô8‚‡î,ìãýé/|�,yˆ[)X¥ý/ãÿ?¿ø_Óu§ŒÿKûÏÙÿññ‹�ÿ9ö_3Œ$ÿoº¡cû��”öÿÊË ñJŸ_ ‡‡«`õM|Ûð—A«?ad< zÁvˆF£þŒî ß~8�fQØŸ.UÈ™_®>>èK®ÔA/úcè݆‡ø6ƒ—=p >?E£àcèÁ�"†OTzé@£q0Œ+FéÅ1ÄŸ‰/Ï=p|pp‡Þ²rp€;á3ùk¤ÿ t§ø³J~øádAõà»?ô^ÿ»atD0 �~> ‡U"¡Ëâ· Ý»‹HèrúMDBóî!:c{=i�‚œZÉ”¥,e)KYÊR–²”¥,e)KYÊR–²”¥,e)KYÊR–²”¥,e)KYÊR–?ùòÿÿ@Àskorean_lunar_calendar_py-0.4.0/dist/korean_lunar_calendar-0.4.0-py3-none-any.whl000066400000000000000000000260731521400542100274160ustar00rootroot00000000000000PK™ Ï\Á�ìTs!korean_lunar_calendar/__init__.pyK+ÊÏUÐËÎ/JMÌ‹Ï)ÍK,ŠONÌIÍKI,RÈÌ-È/*QðKú€äœ¡R\\ññe©EÅ™ùyññ ¶ êz&zê áÄœ°P´‚:�ê ±\PK/Ï\ÌQ}Mý�j.korean_lunar_calendar/korean_lunar_calendar.pyÅ]{sÜ6’ÿ_Ÿ‚gWn5±¤>ÀúÖ®•;QâØ[¶“»TÊ¥AŒ5ɇ£Þ¼z�ÍUä%2*ž«(5Å”ì“ó7Ï.zvþÚL¨FèYô€¯Îºüêâùsq¾*ý$úä›ïÏ_¼¸üþÕË·ßÈ�’\N?¹ø:8YÂéõµ’´=[pZ^œ¬�ÀYqð�8ús™ŸdÅü$“Ÿå4úDŽÍ;(ƒ§ß<{õòëó—rªéGÊr1dú‘ͪJ~¶¬Ó¿ç9Q¿ÛR§\N'Ç·�:_ð©¾n®Ï3Vd…o/4 6kôØ®!úšÙ\Ï�«OÖ05›R¦>ëBóÒ.æ!­Bú³#³˜æß¾=¿üáåÅ[M¸Íõ¢XÝU†0{§Eúô›‹—Ï„„Ò˜‘²�+Ný™›Ï©’J]L©ü$ÝBý&¼Q¿ç‹¦U¿ç\­`VÏæï:@¤%S3¹ž¤eJ,¤¬z²vjˆ”úx¥ÄPÏ EL0©Ž7yÕ¦˜ž�’˜h(Âg•žiªg$œy\¼|ûìõÓóço/^ H½}mU§UÑ�ùÂŒ¼Ÿ½Z,z>ôÂ!ÑA8&Ý‹tN=ÿHßó�t¢ì†­¸ô”òxK… ¼áÂÏK¸MÊ£f.vÅ·›÷ÂoŠSåÉÄ�_–âg1É~»â|Õgœ²«¬¨pJ’`¶X~ä]v½í—Ãr»9S3é¥*ðX•^¾zþüÍ3¹ô:¢´áÏOÁy�ÝtŽ2M’ƒÒ�¤STшh‚â(uU_�¿=—šPgì?a"«§”Ì”¹ ÎHÑê﬚vÚLÔ˜ŽhÄ•ÓiChçÆ�Ú�ij}\Œ!UgÐ-ÆT`<­º“˜1¾à•Óµ¥E[R»ùiGܘ’PK«nfÔÐ<Ï¥±$ÇT´im̃ •3Jýü5¥ ]¹ö¬«h‰_»—!©(wÇY3sãëÊð°XbP"%gÚXZ´nk·®ºöò)jnÆäuSpwÜ|W´XS»µo©uZ9¹±®n9(ù“¹?Ÿvµ•aÞµ—aA¼šÂÉ™P ä è¶š®�s‘s0¦²Mí!o ñò¯ÚÖËœ8ZÂ}ͼ»­g«åŒ¤:-§%£­?^̴ݶN†sJ¼œ©³I‰g«„So« KÝiÞÕÀV=^„xˆ=H±chͺt[âlµ"ÚnÄ‹¶UKWäI³Òã…`¸˜6´ZxV@¿ÔѦÚx[…²íÜÚ Úz>›ÒàBøœª™¹ã/˜ÆlŒs²-Rº*¿šy?Y�RkH„4¯n€¯ƒß�Ÿ§�Ç,å~í «hŠíë¬�yu�Û';´f^†/¶®Q¾�¦ñEÛªÓiÕñÅñÙv‚žW{ì´N§yk(B ­:~ÍÓør0Ó9 qŠØCä ¾x©+˜?»59˜Î«S¼¨ùëÖëWâÏvæ”srlŸë’Ðj‹Ô‰y ®¿ŸïìJ˜|Š‹‘:‘)?쑳ŽéÔãÂ4„ÆE‘ø›ëb¹\Õ,ÉYÕ’"èºu…±ÖÀ/Õ.j›ÂÏ�ù‡(ï�Á¬Kc·òu$õKZ§>×ÍGrÝ9Eê‹$ï-.ôK´K}‘¤ÅZè—¼o'zí¡0þÑÅ Ú-¬/@ì.�?Œý£5ÈáaìÎ}ýÈ#Ÿ�á¢ó:%¢˜ô>ÍuóbäL 'ÚåÀ†�­z¼]Ï*´ƒ¾Èa°$%À ÀuúÍsó�Exi`,«[ï%^�xAH™Ô‰A-#ù ý¿Ã …µ0ì{¼¨˜Niˆ4�ò±»dÐÿàçG¯ à…¤¾Ö%éÎ}-ÉI‚—ƒ½2€—š‚^Y�ëæ 6¥N+ l©Ö1TÅôš6±lã\W@öÊo¥Ëu ‰ð‚ÆnïËÌ?^òÖÔþ,ÆKárÝ錖 ^´¯Ë½oï�ú"ƒ½/ºWF¼°/zeiì6ñ=‰ÝŠ_CÉ^È<^îÐ+Ë«: â'AßÌÇš°¦8Ô+s¶Zõth®›<¨Ÿô5…î›9958Þ+Éuƒ^YXû£¸Ès2‹éì•Õ¾¯[Sî1ôʼN ˜ë"ùƒì«´ˆ)¾¦ð23þ6ˆ/a®;-Ë´·×/…”!ž?x¼w ~lAþ`ð¢{eâ%­et¯ÌË-î•¡u7°Û™ï?ÌÇr]Ëâ^YqÇ^‚‹¦†~ÏÂ^VË$½2ïߺÆ×¼Ònјå°3�™=‘9ÄK˜?Ä{"X¯LÄt°€—FúXŒ‡;†«)Æ{e/Œ‚¾ ‰ð‚øÉyCv $Ç^páëjG î‰pØ+sý@S¤Ÿ¤EÔ+ÃäöÍ<.¾ôÊZ½gÌ”owØ<Ô+Ãóê&­ýu^ ze°¾ðû\yãµÙÑ1�ø¼:ÆK"‡¯)ð9¼uÓÖ+ kp4¯ö>Š�.�5 Ÿ¬{e)^´ÿ¾=ì•ù}dO-ˆ5r¼Ù‹azO$Á‹é•ÁúÔ WÖB¿÷.»$·gjO‰50ÇVkuÀKSC¿l•û^YísB�Ô?À¾AcM {e4ÅKÚ+«FjàÛ;aßÌÇ�±^Y |ãȾpí{e/šš?”ؾŒŒéøyÖ>Ö+k€NG{eU²·(®-¦ÄïŶÕû”ÐÆéßë—û I‡Á˜b{e螚ǎê›Ùkí¾LØÏ‘{"i|�¹ŸŽkã=<¯±£ç)ZÚ=Â^™ÇKæŸi¯LÕ,°—’ò`úf ÆÕ nõKS¦û2 ÷cñ>Hѵ¶GÒü!Яª•@þ@S¼°xOÙë7½²4¾(Zin¯ìpôs\þp ~±}]‘‘çi|‰pZ’/XþÔ/èÞ¥¬_@þ€×¤U ûº@§ ¦”r¿ÃÀά}Øÿì|ÿS„µ/,¬IÅÚñ{cfÂy�ð0¶×ñRýz½$¾ÀX&ù©¼ r�õ Ml8Þ#&”ƒ~M0¢há{ýù¼«B¼ ùƒ÷‡`¯íç0½'jxŸ†ÏÁJr!�—|†íûcرx§eº/1z8,Ä‹¬Y`þæ`.êj‘Æš(«¸Éö?áÞåHGõ傽˜‘üì]š{LQ˜Â~N´'’Ùý/¨;¼‡S ž?àýOQš ù «ü�úŸVï„Àú4ìy"ñ‚ÔXþjaµG“ö?u bE÷……9Ôa“ƒ¯Oå½O#ý§_‘çãýÏYÕB@¯Ì÷ùƒ¬�âþ§Ã‹Ïˆñ±/x}AÀ>E‰äÚV}?‡¼0ŸëÖPwá~¥«Ç…lq? ý¨OKšâE÷áç·ån(Êt-Œééç0°„ä>®Õ]_¢š´Š÷bÐýMç"ÏOúŸ ï|öõð{ Mí6Î*™ƒÝ’?ÌÃüÁ×hÈ^¿–¬/¼IÕ%=O—' û8%ÅûŸ¢~ñ<¼{RïÍØ�­…}Gçøýr4¸'“ú¾=Üë‡{О?F¼9¶\ïXþ°#äœô?!^­é†ùƒ»§7íµ"~²T÷ä�˜®Â{1;ØÿT{4°8R“&=t¿»McM”?‚܃öpD^=²ÝPèÛoËdËÞƒ„Þ+H:šà%®• §&®�äø½‚¤Mñ¢yó5©˜r¤‡ãuZ�/X_®&!vœ~}�H‚~NJWa|žâEù76ñ‚æ;u7O÷ ¢¾kU ýOP“‹ð2Í*,ȉ¿ÏÜ+Èàý粕îA+ÿÖ¤ñÅâË«)Oc ̱A?¹GÑa§œ¥xQµ3ÌIHzÏÞ<ÂNôìFZ —ɽOŽÖ¼#~_öp:¿¯W�ïë¡õiò송%Ri�§á=œº�¥ñe|_ݧ`Aõs<^¦óºKãKׄo�î­=t?­\;Gb ¬…¥ÍÏÈìÚg´MãK„×FòôÙ�¼Dð¢÷ƒ`ϼ…÷xÿß+i!¸¨Z$ÖDýœæ/ ~Añ¢óêà^‘ô¾ (³õ ûŸÑt€ç»ênšÆõÝßW@:¤o¯ý!Öw•1½‡m6v[ë÷õH î�·x±µ0Ö¯ž·õ;ÿkÇÙåår³./�{¾ZLº‹äÏ3õXòOòI=ûP\xêûíf¸9÷½IÏ,û‹ÍÀwŒ®¨|VO xNW=? GõÛÕYuj„¬:gɺS÷³ïùz»üï2¶_ï%aù`µƶûÍÐg‹Ýv>—x’õúIÅ¿ætà˜lµÝþº¿î³å¦_v\�ZKvN{q!»’çÅÙn»ùÓ .?í÷ëìŸò)G5qr|yéYza„Ö öÿë¿Çǽ1«4ãk_ñݯõ˜åV,ðO}¦D¢åÎÄZ—«Œn2þñzµdKý„·z�ž/u¥˜Ú>þ}¦ÉgÓŒ ‡ /�^`”cÿäãÛÂÈô’>�›”ÃEdU3;ýóç)^ozhi”¯Ê%ê{c”] S»æ ”Ï7@÷³7¯oòä©BÐÁx"~í¶û÷WÙß寿 S6é ÌøìãÀ7]¯®¼ÞñËí¾WW 7®Xé2L~»â›Œ~ ËmW<;¦ëínPÑíÕq>™œ€·bªÝoK)ßýåk+_"­Sд‡í@Wgjèr£…:0’Ug”+y/<6ÎE¨Ú^®¨©Ã�ùTÓžŠœó]öÀëÆ úVc™Û�ÆOf�;ºyÏ�°¥MãA>K4��ð%Sw@ ÓÎÿfÄqDðˆã-$�8#çP€ùÔÐ�" ð†fò7²�îî�gÓæÙFex¶Ø§)’§�a†oD»Íš`‹àÉ�E-‡îDW¼°~·¥û!7OµÔR§`ÅùÉsûÞÞ}i<¡='8…ï¡I÷bùþK¬›„ïÂå'ÑàÄQ`ÄëÈ€e'ò$“Ê Ø�~r“¦¡!ú>„±Ã<Ì*à:DvÎSMd§æÄ‡h9Ú©OcŽäÉeíŽÓ_tÝ÷]Dÿc¤�hLjï‘m;ƒ~rã;aÚ¶a76rlç°)�)�*Œ•ñÊcu�àц§NìÙÓ<¤–"mþŽõ}íù?Ú Ç\�5è$2v=jÖ©QËÇ�ÚÇíOÌùÇ ñCp…Köv]£ óóD1ˆz=P?Íç©óqçnà†&î¾Ø™ð?F·(Ü×xÉ#;ÑèDyÏ~ý‘®–ðË^ %YôÁ`¿ìÕ4 Pîg¯¹|˪Èn7§²ÌzÏeëâz?ôY«B»lâÈ^Ôn·¿t¿g9,–|Õýy¹éøÇlM‡« ¿#eºZ‰êe¹éºaüø]íù‰}çë™äûýŽ®& Ÿê¤Äçq²€ Ú2‹ úû?ªI)|©^ã*l@Í$EyÈýœÌ‹³,Ÿže$ûgæå•Íô?ÖË�%�6ü dU¥®´²füe³~júñÀÔî­³w˜ÚŽ Ñ–ó¿<r’•ˆ#üžIÚЮ¢/2}^ªŸ²M)O¥¾ä~vž­8½>ÕWìøîy?Hén7«-^Ý|ä;ˆMc’²aOWÈdAÀp! ÏuÍüÜpx†ùN+?¬ÿû ê±õˆc±]oÃ7/–ëå€÷Bd$Þ5´¦X‡õ„°Â€€€Ãƒø.Ðð›|uÿëòúZˆ¶½Q²öo§ÞI±þ7÷¾ÕpJ­¥~X®V™jEÓAŒ|ip¿Õv0\m¿ùT—t'5)ýìe#*|dü˜oÿŠ#’m`¤òÈXiå¾ ó%wÓƃšá‘WØXµWB?F@:{˜ý}n9“Ýîï} ÅÉ%Rná!òÏw©á°a5†ÖtЭaõ÷ 1�[ŠÛïøC³.ù' ;Þ_eÃþZ1*¢/íä&æz?Þ¼Ïlú'_®=ð³ìße¸ßlÁŒ: 7ހޯ#¹£°=¹üðÝÖÊäDnkö|÷A�SÊa"£D„H’W7±HŠˆµßH"æ0ð�_Ý­  O»MäuKAc.4CóÜãcù¢v©œàlÙ×›¿àÒå­ø&Øm´¯÷dÕËÏñÁêmá~¤¶¹mE¶¨®ŠìËøÖ™Ã·}®¥Q^l>ÊÍöãxÓdßúä2ÙP*á]kæßˆÂw§ß�¢•k$?»H Ì€ú2ø»¬ »eÊ�}Œ?�pË�5Ä`äów`l|®Û9²Fo¬ãĉðÄ0 úöÖƒ¾výÚ� ˜#¸öÂ׿P{§“ÿÉ‚us»Ú¡(ûÙýyúî�ÀjÂwÛÙRcàËàm·÷¿Ïßö‡Ò¶“ʾFQnúƒõÞº¬‡Æôf{†}_vÁÔ1ìzºTMÙïM ÁAÙ�áhz�· %Òw{(¡Bý'Cƒ4Þí©ì ×Pzï*["Ô®¦ e ½�m�‡Ûи)®ˆ›»Q¤6eÙ¨÷Ü‚“ �ôƇÞVăíªv¨ÉÃs»µ{U ø¸!éà1ùŒáàj»£¿c‡mk}Cm‰z;,z*V¦#æxïzð¦m#d°è{Ìúênœ!ëGZh¸®ÈSåÔ¸ÃÛ$ÖG»¡ïPÒŒ˜ÚáÊFÅ_¦ T¡ñ�k[w¢h•ëjK‰üç(ÒØ*·î�³\nÞ¹€V/èÇ׫^[¾)Û¶æº0ÔÅõ–ÿÄéIÞ<¼-[8º~Ôû?æõ 9×k¦8ˆr%ŸÄŒÏà†ø¾‰a-ôB®4à„b™Þ€œË6ðCd³øÏ\ñ¢©"±ÌSÁ±&²$]ÍDöSÄeRC*–B#©–@‚W*Á "[r•,ðɦ"zGs¡3âœK r¦´HV)S�¯T. Žò3¤ÍD6W¨Â—<ÓTÅð'|@±`iJR[¡{Eþ ‘ùF‰Ç…†…Lg‹SŽÎØ4å) •¤L,c˜±%{ä#J"‹ŠhìâÖ N%Òcø%ZÈŒb$2Ó Ÿ1¦Túº��)QÐBæJ.ãˆÖ‰9’ .ãZ5¼¹ŽÐ{UðB˜q–"WA`Šø<<‰þPK=rÏ\Ù§à ¸.korean_lunar_calendar-0.4.0.dist-info/METADATA­YokÉ/Ðwx°ßXF»’ìø’(Ž©q’«ûb"ßÁ5”h¤I¯vöffílñ‹´äÊ•k)i¯×–&%Ð;ŽB ¡í‹Ú7ý(áR¸Dâžgfwµ’%Ç 6ÖÎÎóÿßoÆ»\3�iæ|Ä¥òEØ„÷\¹ôò&ÉYx'ˆC&ïtYÀC�Ér)ßZwϹõr©‡L&MØá!—ô€Ã C †2ZТ֓bhv¼/y_H7)7-ÝØ¼µ J3zò*n¹´ë��2?hÂu?ôØáÖcå‡}u�ü O¯Ü®n”K»Ì5þò3Sìø]*î\½I®¬q»ÛûåÒžwyW;ÞÚiÂÅ�G¬Ï«0Ð:RÍZ­ïëAÜ!&µŒom¦ÓîDɳ[<Ê×B&ÿvÛJÅ\½«šoˆË¥<9ÒSÍ<UKS54U§êèñ/_?ùº:úò!ýyýùSüS.m ×ó¹lÂ~È y¨¡¥™Ž4›° Î^ÜÕèà¾è|’p;Ô(–{°{>»œèRn˜t“›oâÓh´¥ù�öÞl!�GÄ%Ô“ûQv_²á�(vXØ�1”D³—`r…ômu’`_D~—Ö[¢§�˜ä†áúŽß‘Lúäº[ü“ØÇÜq,·&l\^uß+—®pÕ•~D;Xhžvö“‹Kó{º†usà‰£pœ‚×ü_îlo]ý ué“� ýn‚ô}Ï'§•K냰Àð…æracf|×kƒÆ†!ˆ¦÷—K�—l‡ë#ÎCS˜ëJKö7f–ðz-} K6*€uJtÄ.#�WÛEj“?xqÿ @…ÐyA¢× °p«ÐA Ž(TgÉ{—² gÄÉ=`Êw%wdmaƒúÆz�!s£:lab˜[Äjumbm‡Jû:Ö¼’wl4ëµèg�Ð!J"ß²_‹l-Î.1ÔlÝöAÉî˜\5ðyà)׆Síp6½«û ¨�¾¼°—ìmÃ¡í¿ PÛ k�foâßa^Ÿ×²$ÂÞæt‚˜8ãR–cÄø-˜b¹)ç'\ GÅÝ.¶Ï×á2dõˆžW9ïiWf]ÊM;²ŸÝ¯îª3¸3Ól(œÀ?ä34ÛÁe  c7fÁ߀ýñ£ÌÙ`N*>U Ô€š•ŒÂy ,M7w@SA'Ö¸?„ !ñöü^�Kê 8w¹rQn L+I V\ç§™…)Z.-.Â5Ž]URã)—X^Þ?ÎK kÊ™²cyÙT–-¿?ÿMª<™c¿ÑšyëZ7mé¥t¤Â˜˜^ Æ Ð ¸w B!ö !È!Ž\Á–ÆeˆÖ+.1™TÊû}]g°ôêÙƒÑ7÷ÉIÁ.ˆRüvã�<�p¬˜!¶ÊAÍC‹ü:BrŒžünôèÉëOÀë<ýá«ÑŸ¾¨LiéÛç?ýîÓ_¼ü×?áÛç|ù«Ïþ÷è³JªÇg‘cx£†žj0`d”BY¨>Zè]ƒÙ§P⣯pÈåmkV à³XÈ!ôY” Ù#Œú!öÏ0J…àè@ë×(‰0|¡íŽAûˆX;¢çHLœ|:¤MŸËªì.(£àc#L%¡äÔ¸—갇ɑ'M–\©"'=ð¥çDLêd¢:³ôjÅQ$$²£­ÃV†Ïès ×ÇeŸc–0þÓ~§ð�7<Òþ“–ùTÁ=íF½^wê üiÓãJ}­î4NãBÛ’´Lvç£dL²â4V $+ÎjÃ�à@5.Co+ߣÚÅœ66bcí¥y/±´"z4Òˆi‘ Ú×X x;ó ,zj·ÛXöƒr)ò#L&³>DãÞ”$2ˆ¡\2Àxæn}Ò¶ŒŸ¶¦¡&*fcµH!Ì ?ó«q’YI]<%?—vy– %³}‘ÜaX“—¨V«¶Pª˜ŒIœ  „ss'Vê�óUx¯ +ç ¿�^Ê÷‰ÛJ\Êbz©RÉjˆÒ©¯a*”˜—é }®M»i™&3ÁcFï€ÑŸзÇÿ6…NÝdÇ´¹L1^„½^þå)}ûý×°ôÝ—¿¦îSÒb C–½&606‘ß50f}f`ªØ»'Ü6'Rc�‹k¦F MÆÏ ˜1a2`‹@¤N}ΜEŒÏMX^ýý?£ÇÏ),¯ž?ýì)†Å7¡;,Q ¬dæq·ï¦3­q~弑ÜÈö •vÚW眕Æ\‹qGV�Ñû2æ'a¶µÆg±“ðõßžkŸ=}óÀ$!&¦±¶�„iÊlÀf€“]AwÀ»¦?¥}'LÌ1C»Xbm¨™…Ü®6b{œPDƼPãwšÆI f’@Tƒ-ÀYbV——ñ<¤!…O½8À‚ÌÍÈÏàæÞ¶IØ™¹Ù†.®š)EóHsä‘ Œ¨ -dÆÌ«’ÀÐh >HZë‡þ#àcàåÚy´Ë‡\=Æ£´¦ÇP8mgÐxÜL»§}zK3cÄ iübÕRÜÍH'^äióßâ3¿ç+]€�¹.oSÅ3”³•`kOío£{?Á£¾¶“JIJ¿”#’Ì¿‡[˜¶¯!) c‚LßéŽmB|GwrMCûcü8»»Î•+í*!ʇ6LiǢȞÿɃl†¸é ,гít–¸Œzº'¨Ç´›t ì†i·M;LûlÓ£(lÖÔx“Ì ÆvñlÁÑI•É?Û¬±ò˥͡V(]S¸‰ˆÍ�ƒ,l­Yă#ÄdTx<‘XüAÒÄŠ6©ô1&!Ì>ìR0ò§+,¡ïÓI†K¦çf”æ!§T¶Ô’@}”#eZ¸Z„É)ˆ&h® ž°&4< Ÿ«ØäsÓë†Ýˆ°Ðéšï4Ro¥ š¦H&ҔǼrñ¢™ùÄ´°#í¿jTσHk–E#G.ȃ™pž™E޲ܵJƢЃ¬+ç‘ÓÅ׫p¡žÔ��ÕéA'™ šç«Pa´޶µ¬Ò£ '›Œ�Â&&p4b2wŽã `2 §¸šv¢±«�"Hƒ}j‘“ˆÞ^:CˆCs‡¢sX$¹iFT�Þ+æóëì�¥ç®ÛùE쌔ûñÒi7·3*éAÏèuB¼«ÞÓÅÌ£ªŒmi™ùzFywջȻ«*²è„â(à^ŸÓ•«qêÖøR‚þo‘^ÚyvÛüãà­.ÿÆ ž¸OD-Š7 /îÿÖ"Éü.vYHÅÀÂEçC#�&Ww_ Æ`Ë\ø \s�’Ÿ²Ó+_z¢Û·ÿþnçÿ¨8Õq¨Ù÷PK=rÏ\'LæŠ\[+korean_lunar_calendar-0.4.0.dist-info/WHEELÁ1 Ã0 Ð]§ÐØ2Iº_ t+%$³ Ÿ&`¤ ËCnß÷¶¨²ÂÛašyL=¡ð晢ŸaVßæ) i¼ÓÇ,äÕäÝõøfï ¥ü2Ÿ×CÔRô"úPK=rÏ\ކ¥â3korean_lunar_calendar-0.4.0.dist-info/top_level.txtËÎ/JMÌ‹Ï)ÍK,ŠONÌIÍKI,âPK=rÏ\Ïó=m’,korean_lunar_calendar-0.4.0.dist-info/RECORD�ÏKs‚0à{ á= DQ¡Œ‚V¼d"¯F#Q ùõíÅN¼îÌî7{ä×’4˜u ¹âœ°²)Èu„1m¨ÀX9ߥö‹h¦õÞ¥r4PsFhí™À»¥++¦óÉ6B†äpJî¼tû›>æÛñéðÓôŸ‚/} Ç¾7Oú<ØÄÅú¦³\w–Ñ%6æ‡(ü‚±÷ÝË{ %ÍÖlû¹#«Š¡¨JA[!Ó¦â#Fó²iËvÎ<ô‘ ‡GNÖzçk&t5¯¾‘=ÌÛßÚV[ÕûÌýÐwZ.–PmçE.B©ë»©û`8´‰¨[ul™¸ï§XÕ'ÖöWk 8^‡p‘Á{QYµd™Ðx‘ù  ÿ®”¥µ X6õ‡q�À ÿÜÆµÞm,0uè!n»³|t8h�’^?cVÞJ¦ˆ^<¤`ÑC�È¡ÈO›³pZ ÚÙY“uÜoëo�@²Ÿ…-š)—4íEi…¼xåKÒÛPK™ Ï\Á�ìTs!¶�korean_lunar_calendar/__init__.pyPK/Ï\ÌQ}Mý�j.¶�“korean_lunar_calendar/korean_lunar_calendar.pyPK=rÏ\“c7…76¶�Ükorean_lunar_calendar-0.4.0.dist-info/licenses/LICENSEPK=rÏ\Ù§à ¸.¶�µkorean_lunar_calendar-0.4.0.dist-info/METADATAPK=rÏ\'LæŠ\[+¶�á&korean_lunar_calendar-0.4.0.dist-info/WHEELPK=rÏ\ކ¥â3¶�†'korean_lunar_calendar-0.4.0.dist-info/top_level.txtPK=rÏ\Ïó=m’,´�ï'korean_lunar_calendar-0.4.0.dist-info/RECORDPK¦)korean_lunar_calendar_py-0.4.0/dist/korean_lunar_calendar-0.4.0.tar.gz000066400000000000000000000321611521400542100255710ustar00rootroot00000000000000‹’ 0jÿkorean_lunar_calendar-0.4.0.tarí}koäÈuè~& ÿPW_«g»[Mv“Ý­�¬•4;ÚÕc iÖÙ ©HVKÜén¶›ì™ig8Á:pà�ÇI;0F1’|ØÉ—üÃ`ïüˆœSÅG‘,¶ZóòÞ»¤g­&YuN=Îû«šëÍõ¯= Ïî3ê²é[¯åj‰«ìo«Õn§¿ñ¹Þ2tý-òì­7pÍ‚�Ný[_ÎËè’Qè�Ø]½ÛÓÍv»Õí4õN»×ïhoU×ÿÿ×cÊèø|8Óé¹C‡lìÒi£Õì4[믒ÿ»Ýn9ÿÃoÝ4ôN«Õ± øßèšÆ[Ĭøÿµ_Í/‚ü7¬¢üoWòÿ�È##ÿ[ýn¯ÙªD%ÿAþïïmïžì¾þ·,«Œÿ�–Õ�åËì üow-°ÿZÿ¿öķ۟ÞåUHÖœ1Zz¯a€<&ï{coHö#wf�7¾ Ï¿v9¢Þ°éø£MM{À¦#/<L¼€\±)³çärJÇ!sëd0…Šþ€8WtzÉê$ô ÏÉ„M¨àÛ!ðãKB‰ø5(^˜À„Oé”Aa—Ð ð�<âúÎlÄÆ! ßÀ²€¬…WŒ¬žD5Vk‰ËèPóÆßůÈS/¼òg!™² œz¨oì g.¶!~=ôF^„«óA 4:  ØÎ:ù®7À¿Œwk2³‡^pU'®‡ íY|è°1Ö‚~¬ûS°áP´›÷5m/ƒMŸà€†Ñøäé•?ÊöÄ ´Ál:”Œ×q}2Žñcæ„ø‹üáЊ]sü±ëa�‚ M;…WÔöŸ0Þ1çc?„¦Š&àLÒY�^Wt8$6‹ ðÂðR©;SD<4=:$Êñå»Ùü÷wÉÉѽӯoï’½òàøèý�ݲºu÷«uòõ½ÓûGO ”8Þ:<ýˆÝ#[‡‘öwêd÷÷ïžœ�£cmïàÁþÞ.<Û;ÜÞ¸³wøyê�’ý½ƒ½SzzDajo÷�ìo߇ۭw÷ö÷N?ªk÷öNæ½£c²ElŸîm?Üß:&?8:Ùô;öpïðÞ1`Ù=Ø=²}ôà£ã½÷ûGû;»ððÝ]hÙÖ»û»tj{kï Nv¶¶ÞÛ嵎ʱ†ÅDëÈ×ïïâ#Ä·ÿ¶O÷ޱÛG‡§Çp[‡^Ÿ&U¿¾w²['[Ç{'8 ÷Ž�ê'Ô8â@ Þᮀ‚CM23EðþáÉn�ììní¬¬Œ]Œ 7+¡²ÿ_eü§S´ÿ�Êþ#öOÿÑ{½ž^1ù—ÜþðÁ{ Ð|G¯×þ×;V7ÿé´Ìneÿ¿‰ë€…Ô¥!m|†'XnÄhvV´C:bDI+ZR”“ÉŠv2�èt¾A¶ýñ6 ¹å÷¯Kx]×u}0�ÌÚ÷¦ìÒŸzP(ð‡r¡µÀˆ!hSÂ�[k®h[3°Ñ§ †ÈÆ5¾ÉŠvÞzléûÂ`oì>›€— :väŠö`ê£iÝxx¼¿Aîû#6¡hø_…á$ØX_¿ßaf#�õîºrÐÎ'ó°c6ñ/ô§óWn/f,x1P민¢}ÀæOý©l$sQuê¼N�ÏSýù�þüóÿ´þüßÃ?Ÿ÷çðgEÛ‚Ãæ <6Ý ;ì útÙÈ øT³€ll“4´Ù�ql^ØC–­¸îã�Œ-ðÍØü��]¶ð< üœ“y²–=[LÊ8Ì–Üà ŽFXcŸŽ/g0•XçÁˆkŒ¿ÚÙ §àâ8øæ Ù³pøæ±ë?§$x¼[€,B/P>¦#ÏÙ ‘OÙ@ïwE[Ñî\éà‡y—㻫ð"dÓÕMåüÞY¿Ò7y…I¾üŠF–µYø”1áúÞgÖ_n*YøÎzô–¬ B¨Eî#CpqÕ2Þ–ksú©‘_~ëûƒ7œƒÛ8ãÖ%'6†LÉÕ” î®ÆNRó1 ¼&ø—�§ë«›(7î¬SΛN¶824çM<™P ¨GÖÞ8½<öZ"i@ÐÜYŸ,¬B&ó‰×ô§—ëÁ‹jƒ–ÝñF—$˜:iUxÐ ®<6tƒ¦çsHëOÔõ›Á“ËUhOxwõÁüÁy"äï*YßÄÞò–]ߦî%[�‰d[ÃΘÅ4†€oØ-h|“MýF0sŸÔ߇Ç$æGù ��ÊXJ5#ÉàÕòêã`‰áŒ[6òCï S´l,�c<ù›ä4U`H9ÛW@“ËqB€Á È2èKB#ró ±�0bÏB(?&Œ¢øc„ízƒ›¢½Ë‚& ƒ‚C.Jæl dýÉua†DW´[·È=RuŠ‚gEk�Û·OŸú�§tŽŸˆ:nßæœ%Øï—úWQã±;â>ão›Ä‘`½¨6!F¸¬&¼CcwÈÜwÈØ'c�þô1ÈT<‘Ʀcè}À¦O€˜‚ö{tò>%k¿ýŧÏö-ìÍ'[B°g �Ç8s3QyµîB�¼1±ýð*�ç?þ›ç?üñçßþ”|þoß{þw?yþ߯e&iíWŸýño¾ýg¿þ�'¿úìïýßùŸ~§µcŸÑIƒÃ&zÔ‚+Š� 4z#¢€¼\øPr‰˜#ºÙ3$ã¨ØŸŽÈ%�DHöƘõ' ?\(Bªz°p@%˜¾q@(¹°}xññgaÃ4¦ ˜Žå¸�­¹dS!ôF`.ÌBc˜v‚SA"œ2”?Ì�Úðˆ#!š˜¸¢†Œ1LèMÝÆ„NÃy†;cò:™M0’Š˜·Ÿ~B¶cû ¯OÈ=´ãâëP–$½>Áò é"×Übù}N–‰V�2:ø�–ÿ.ðÖh™­†®7ôÞ…¨r©;Q%i£¡·¥*F£­ó* Pù�ÁhžËDÔ“÷¨x/¢û)°Öƒ§ ¢ ýhÒÈÅ=: ØEHüI4Ä9ü ¶»*Dk¼ø-Çq yµ.¥Ä8¯‘Æ&A‚N¡53Œ–Þ­«NŒ‡7A®%e9ƽÀ¿EõZ-&¨[˜šè6Z&�·6-À¸d!7'\Èd`(dyþ�Ÿâ¯ý'gt”&*ˆ‘pɾE²†üúŸ~Ž¿þö§dí7?øK”>Ò$ÝŠ¦§!¦^>bb!¿èÄðçʉ©ƒìÎ [ÉL¥ô¾ Ó¤ÃLÁœâUÆ»��°[«6Zmø·ÌäÜâ“ñ]>-¿ý×ÿzþ£ÏpZ~ûÙ/žÿÉÏaZDç2m'k(kq÷Xó²é4½kt9f=.½*P¼ê4 ½´ÇP¢NÚ¼Ó§Ó«-Ù[ ð2½"üü_>ã½ýÅ÷žÿìSN„@˜¼·F$³I¶† Ùâ\1ç±HM 9fƳl2‹]�uþ éרö ¡°u#ƒsa³aˆê1àÊ $¬PhCžN‚§·oƒ?’È|̆ C8Wù±Üz°Ç VI›Ä�§\K¡> Àˆ ˜Ñ&9`”ë±:"óV ½©¼ –^M¡�ØÈ†§Ÿ€+-”é'Dò¶d”ª›¬âe.‹4®F¸’†¢¹©òdž7“Dšœ—é"}oáž=ó‚P2“¶Ü„‹�œ v‘+Ãû põCac"‹ðï$IÜx4¯ÁB ÐnH+ÄíÍKlÞ °ïðï~Ò0�ÉÅGp5;;užu%$×::™ÿG�*Ðå9PF'Ä© ]\;Ï�™Ú©êÌ4vÇ‘´�$ÌÅrÚCF¦Ò×áŒÍXL�S°è¦AŒ9]#ð¯h[´Z¨ÄºœqçþŒ;$0ɾà5añ€�1b À=™óçÀÑœ”>"„ 78ÉÝ�ãï<‘Á#.sãšü&©V›'Ô‡‰¥Œve392¢Ñ4Ñ—t/¤R�#£µHŒ’³G™ é÷¹öH4¦0;"ùä�ê2É ôÄr”OçÒ +«iÖb’ CYV@ߪ“žd<�=àN—Øór/¨l\Dƒ$ÕÊ! ÑÒF†ŠBFÌÂð$7 ¤T�ƒ��†C�%¡³m]6ÒÈ)ŠÈ¬E/‚„�™�= MPŠ�'r•#®¢†Q\1qÌß§Ohäw=J± ’;[[¹UT¨EŽoWCY¨w1š²Zµ´/'\¿.‰ïãàEð}ÔbËÂy<öŸ™{É0äÊu; J`Þ"  }öˆ'nüKXˆ'B+äè/¿õ×Â’Lb1ä5�–?æ v8vÔ\Ѻ ÔØâÀËÃ(‰—…|ñ£oÿýÏäQ’¨X8pвjýo•ÿ{åë;½®i¶ªõ¿UþŸçÿ�w·vv›#÷õæÿ Þaþ¿m™m«kaþß°Ì*ÿÿ&®¥5E^ìÕæ_[ ñ ey©d˜¾˜ÙÃב<|�¹Ã/dê0šõ×—7|é´¡&' µ—O¾ÆŒá$aø&ò…_€táKe 5E®P»a¦ð†‰Â›ç ož&Ô^a’P“R„ZN¸>?ˆ%µ4`õb¹A$N j˦e¼×ÅÉ´¥3‚K$µW�|åÙÀWž Œge©Là ÌÅ‹$—Ïj7̾|P{Åé¿e³7Lþ½ÂÜŸ �×�ø{ñ¼Ÿeý´×˜ó˧ü´%~Käû¾@é¾ÿDz}o6Ù÷R¹¾7™êûgú´—Ïó½ö4Ÿ–Mòi¯+ÅwS]YšÝ{ɽ—Ïí½\jï•gö^mbO[�Ö[:«·LR/1�yFO2ÀU鼤p.—§½æLÞLä½á<ž¦Êâio2‡÷ºRxš”ÀÓnš¾ûåWšÕþoÕþoùï�n¯Û®’€_öüŸ:ñbü³ýߺ†Õ®öûÒÈÿjýÇfýG¯_­ÿ¨äÿ"ù~Fnx~ÞœÌ_Éú�VKa­ÿètPþ£*èTë?ÞÄÅKÍg–´óóȃ;?'wÉW9Á|Óá�?zD¾ª¨øUrV —JÿWúÿ ªÿûín¥ÿ+ý¿Hÿ«™-2ë 4¿ëÿn»�ú¿`¥ÿßÄu‹4n7ˆãc‚xƒÌÂA£‡O4muuUSiþûŒoDŠ »híYèÇÉÝ̦O iÓ')��ft£ÂI1yMVjƒb�\n)\wEq^fY\Sã«âD?Ø;<ÿpkÿá.˜N:7Š[º¢ÔÖï%¥0Ï¡ëzO.ur´¯‚¬¥(•‡e´Æ"Úw·NvÏ?ÚÝ:ŽòŠ(°³õÑùÎÞ½{ð¾ÓN�ˆ—'[ûûçG‡§÷± ¢ëK¯ßÝ{/ó²-ƒuuüÖ2¥×X7óÒÒ¤·ðð-Ñ6®`éa>þkåþ*žý3y ¶ïï¾·uˆ ZϨ£C‘Ö3§Ûéà_ÛqÅ}O7ù½ÝæÏ)CpXÞvù{ƒµD½žxï8� ÀðþžÀátû¢¬Û7E�nOÀÖù_§ïpN‹:ü¯eˆ¶Øƒ^—!þâ¯kvó8¼¿uþðpïT ¶uÑ)Çr;bçL éöý½Ã] ƒìhtͶ�;Ìì‹¿zô·ÅGÅ2Zÿšî€ß›¬Ïï{ƒ¾Íï{Œ÷ ku{g<Òp˜¶ÙŠ€ ¶Ã‡Ål[ÌnEHÚây‡ƒÕ582h$Þ×;ý¨QŽ€GÍ<Òìx˜¬Û�Z¢ÉÌh<öOw�··ö·p?Ýó“ÓãxêÄTôÍÞ *y‹ ã«0(&·/¹E¬bU@´ƒ³MAârÂÓžµ�h;Âr®˜?¾Ä…­zK¬1…›�=¸5jäécÀ0ê\aŽ „"$ïs ßo<¶&‡$ºÊ™'žÒó£{÷Nv±ëV¾Ÿ�ô}Kz/x·£](“¢KP€Atr%r ­(ªv¶N·p&4i�)’ˆáX-jv9¹昆-~;�–+È„—qMÁqíV«oR7)cZi™¾%ž·q»z7ân(Ó‘ÊÓŽ[Ϸʬ“–± +ÆEmÓJàS×LÊ´Mã²ú]á‚6˜iû;‚—°L‡öm© v¾ €Kw(Má[”ðbß ©_†m¦}OÇÐìP–Mh˜RI>äùE!'{¶Y�KŽÀ›Ê:ÃîJsZà‡Óa‘_xß»]!ÝùÂjżÃå3üYÉØ÷Œ<´ :…ó¸㬒“1ïäô‹1è(íPé¶Ä/�Âe{¿-ë—nF§(ô…éêE]“•‡ºn¸é8tÜd|ú†É’ò´È/¼ï²^³új}‘ê—Vۖ퇔_€º’]Äê ¬k~ámcývÂw–BoʼÃiÆNÆÜ0‹ü‚cBe‰õK–O[V,ë¿H ]m¨é�™íÔ®v삮ᲈ&´jÉ>KG²h‡¥vuF¿$í´]À¥¶«SÞ±“9Åo‚¤6˜2­&í1©^Ô/’ Æu:£Y>UЃ�±$ÿBâ«#ÛÝF6˜°«‹üÂá[v;Ã/jû!á�ž!�sŸ©l]Ó•pÙFQƒ‰ß‘ÌOè Hž-”²,âr^¢gª¶u;6Mù" q¢ b[WeËuúƒEãÌ}IPºj[7ãSHrÉJl!»o ʇœÝÛ•m0·¨»¹¬3‹rIÌijëê%¶n�*ü‹‚Ýk$|aÊr‰ºEY„¸›t(�Qˆ¾gåC$sÑ•éVö/$ÝÝŽäa^.9Ô’lxYwë©ÿÈr2_Ån:§&8“©LPÚººÑ“Æ™ÉøSWïäC–_`®»%_P—|Þ÷¶�ñS¼I|@�~;9~é˺̲ iN-•¾0ÍvÁOÌø2Øž¬üOø…ʾ°÷ˆø…ëtJ³ü¢´£RÝÝvdùoJrþ%be¿˜¦Â¿ÈÇ4h/õ%™Yà—…±2‰_,*ÅÊ2¶®n«ìê•hÉ:”ët‹öë*›Sâ`}9V&µ­�ÆÊÌ¿(uw*Û]ÙþLøE·#ßßÉó‹‘Øº­.møEÈ:ÝÌÄÊTô ñŽ#Ç:ü"bef�_œ,¿,ˆ•uw¤ß©Âþl9©…±2É~Hùe‰X™Þ±rü¢�“RÜ,Õ5YŸbQ¬,¡UKî‹«´uu˜G)'SŸBÄÍÔ>¸:VVbëfbeYß_ɺnvUöCi¬ÌJãºeT+KçÔ�m]…ý€q»#é”Ô§ÈðK7’·ý’µu[ív1¶œ÷_ Cµý`fâf‰®‘쇈_D¬Ì¤yßßÉùþ•x'+SúÝÝvÓøC¯ÌÖ�uY>Vf,+SðEߢnA×,Œ•©|™B¬,•on¿“¡[¥ÎJx§Õ�r"¼+³¯‰•�N§ªX €´Ôô�ç�؆/ó)Êce}É®–â«9~QÈÉ^ß”xÇPØØ²Î*غˆ‹É±²$˜è”“ÔÈÅÊTã��›¹R^Ƽ6Vf‹œ±Ãe{›‹bevIü¡¨_¸]-ÅÊdÿ"Ís麬¯£ü‹Ðéæ@âÙ…¾?޳E%™Ãú’ßôÊbeY\iW§2Ê4]sQîRÄÊLU¬ ä�$Û³±2SŠ•õ•6ŒlG¹GäD üÅÊì<Ýbe¶¡Ž•¡OZä‹v‡*t�lcó¾K~“Ä/}K–K­²4Vf¥6¡à¥|�ãf¦Rרr¬Œù¥+ëHâæðÊ1¥¿)Ù´+ÇU üâäs"Š\++êŽËTùºÑ³ qfg±ÿÒNôZW/ê—Ÿ¶Í¿¨ì‡Œÿ¢Ì]¢ÿ"ÙjŸ´cYT9§’Nic¾RÅït])®"Ç?Ý4þ j­À/NÖ'…¾«×ÆtAx•´¡,×/ó‹Qð…¹?e—Äp"]†í±2üâªì‡®<�.UæˆMʤx-®‡A\ê\¿Þs;æõq9S•ëWÆs‘‘|y�FjƒµÉJùEïÚ%ë‚ò¼ó;mó2ÙÜeÃq²ü‚>‹­Ök¶RNZ��¹(×ÏíjSZƒÇ?åÜeI ‡Çå2¹˜ûAÊ]šTw¥¸ŠdÊñZȈü—i'Ÿ‹Qæ7y8;ßRÅsº¬'åõÔkMZ¤Û¼ýÐAìû¡—µú‹rýr 'k5;n·t½“"�Ó¦êø'ø/ý<¿89ßÐì·ÛR ‡?gêõr4³&“¦q{9×/ç  µý`:´À/¹ŽÞ.³$Þ�q¦‹â9W_ÿÌÚÉšÞb¬ÕTú†•ã�˜ß�îÂø'ÏÑÈ1ÀŸ´ÃQæ»í…ñO‘R¬AÊÆpÀ®.ÉA÷©,Û¯³0db|ÕœOjº´À/y_É jýÒÅ8€Ò~P¯4í"¿ˆ¶¥>)€,‰á¤sj˜9~QÅå,3Ë;Éü¦~¢™‰çñrïQÕZA½ëô²ü¢´RÞ±Ü^1_�‹»v Eü³$†ãäø¥[j?tTöƒn¦ë¤µ‚™õç¿*æ ¹|ëõKÌ/*»š²¢®)‰ç(Ö(vS»ºÈ/ŽXÛ�ååzZöíFÑ.®}2Ó¸œÙϯÙKÖ &ß,”æõ–ûv#ÉwËë:Ô1ËîšÊ´:¯§ÌSä¾ÝÈÆsR~iõ,·¨_ry=³Ÿ[[»h=-ö�õÆs8¿w3òЉûÞ¥vÙ÷é\;eöƒòÛ ½­à‘’cæ¶¼ÆÀ–Ö9¨c8Š5½b�gÿÚïq Ù~�øEò_”ü"ìêÌZ‘öÂõ´’ÿ¢üv£¨×ä4È·VQ¿dc8 kq{y­`¯aª×°uËÖ°Ù†”2ŠkØb_X¯îÙÖYú«Ë$Þïf-`ÃAm#©„·ÍdëÜ䣸ì+¾nÉ»:/¾Ém² Ä–´ÙRɾ»Eé.¼%ïb´ZºìùÞ7™KœÙh†ˆñÃj~4È · æ{Äd¾Kä›ñŠ}1'¸Ó·+úþãÙ·ò�O`bÏ×F�+|o]üÕª7‚Ùˆü~åÈÍl‹ÏÏÓ&E{ÁÎhþüay¹h+ظœÔ´6 ¸û9~féC¿D»Ãó�¤¡¯Þ�Ð1aÏ&CÏñÄÞü t¦íâ5tüùw“xΟ®Õrã-ïKËK4Åè‰ßÑVßâ÷×´„êr[mçhQž„8û«_Õø üÿVÉWÈZ–2ëyr¬gi0m³7PÓàF†QbÜoòì–Þ«I¹h£ú¨hÚ«Ü–Þ¹^EµJ»”P}=Oêõ,}×4‰{/Ó]„)‡Sç”VÄËA>&}Ä¿Ãm(Þ&_ÅŸ©ÐeF†72B>ŒSlÁZòŽlnü ÷ÿ‚\Þ¸§îÐ<�:m÷ÐÇïrsÈŸJSDwcÊŒ!M¦ ±§³‡9‡¡‰sfr¤"¿Ï’ €X+·»Ñ¦Ñj-×ŦC‡Uy‹jY,‚@9ëspª-°%™‘Ö­h õÙ$-Â@àÊÕsdbÙWÐü|ˆLtéÅZSlIÔŠUucð÷îùuÈ”F�Hª2亽9Ô¹R›0Δ÷ÆÒ\à±@#Üÿ^68-Ô'p7õg—Wäb.6“E©)AÜ}²±+v‰žLÙÏŸ¼6ˆqÞ— 2yŠ'JÐ'Ôò¨ÖèÈŸ†\»­éµZ]‚ÈϘxêáøÎFÊvù¸9R'G p‡~H‡M™7xQo, eç Yþ†‹’3¹âZ$\`ªãê¼¹Hæ(g:Å‚0ÏÈÛéÜD}-±´2q'lŒ�¢ò�é×4K�ÆÛz[‚ÒH›CN›% ×°@Ž×�¨, ßå[ñ¿A½^Ö+ |žê¥ñœŽl—’ùFQrbýZíúöÉú sìGþÄYåçæ'!ŸÍ»‹%®B|ƒ<ÉÍL<ÃÂbL¦X�Z´p&•Ýç½I ¦ÇåtA‰*("ó j ¨²Jt­R©ÕŠP3±àX W|w'�b{— "ÌøÔ¡%é}ËÔú¿äè˜!)Ú–ãÚÉôöâ²b¼¥4’³ ÞFdÚ«´Ê§µÌ"¸~.FB½fü½@ذrÓ$i³È¸Ëêáv+£æssœø0%Þ�M¹…–œRpXéFJ�tãŒO¡¨£mˆY‹p–Œd´¥¦ŒWÀC}u½v’êf¶~Š=—kFv“©%80™�שq$j�“RHQã(ÚW¢q)˜›ª†"§Im̪5›åÂ.1€Å¢n‘d+›'•d+³ŒdËË4޲‘!ÌìŽh×Q“"xwžw#‰áñÊþ{ìº/óTŒZQ(ÄÃycØilC}* <)cN2ˆ4††â%n÷�üÜÚýv|”RÄÑÒ -CÄ£c$²Np2³¡~w^43²„˜Æ!":Ôk_7îXgY¸y¬…±'$)‹ˆqŒA7ò-~[/T³§Œ>^=L~/ˆ"¦7%áĸ üÎÑvBÐïÎÓH˜ m9š#râÎbR.›%¨¬®Ì÷[:Ùuv ÐqÙl :nù�»Ò8¡'’ Þ”ßÂÐI(DTŠz½Ío1L‰¯Š²äÙ"ÒYêÑѪ8ºþx8Ã+‚�ü¼ð(0I�pF‡ `гã‘ð’(cŸE-lªdg<~ªHüË;Ôÿ'v¨Kk íJ¦ñ¾7òB²„ï]�vJâPú£¬?‘0ç`�„à7pÃSÜ¿:wâeþ°Ëw’ýV³ Å,¡7Ц!'Ü48ð„W>´Wo ×€òã—Å9£ §ðn$ÇÒð/<á'q¦DŠOZ•v’ß@¾ær³¤j‡p7�°2= \~J§¶ ûÌé�/èÎ�ëå}jBät ¶R¡R®iCN>/¡R—V«‹Tk±Ðµjõe8¥�­R¸© §%ÈéÅ=ˆ/ÙÀ×#" ¢Yìd-íh©Ön$¾–z®Ô>ײ.Ò L '.~ôu>£K:øº|íz ¸�Ä�¤žMùöýCùüp À—óÛÑ®×Â$|w¼®Õ£XdúŽß&/Až¥¯àF¼¨É)ų)Û�ŽšLYpEÂÙ„7´/u1‰9š…@ÀãK›âXû&ù:ªû±/Af€´pDŠhÜÅŒ‚&ø°ûßdS?“:¦56}¨$�X ,Š4pŽ8_ÄÂOM“Ù‘D0°isùÐÍ–‰Ô•b)X–;J”vîÚnÔŽ““ù+¥‡âíÍ÷м!g²�ñá)Z¾ù¹º0ß-<-)h3Ðñ�H¼+ƒÜÎ/�Y¼ìCj5åÞø&Û×ò0¢ cù~ëµkÐ�¯È£RW)ç%�Ê{§/�1×ÜøÅ�”3ƒJ¹ü2= ×€Ì6_Õ>àð¸u1!fà(¶˜_¢aå°®oQLôuÔ“!¬G�•âö±= §ÀýBŽJ<´F†Á…–Ùcò1�WŠ9ø?’ùÃW9WS%—=Š�>j��¯æ‹ñHÊè%e∴ö¢eܽ…8“B×"Õ—B*Fr!ʨȵ�³Zvݔژš5'$“ÉâKëÖp~jÙ *:ÁGõš(dŒGË�_tôÎïž ó'�”‘aæ¤�2:,žìQBˆ¬e”˜E[FŠ ¼úrxÕĘŪ¦FÎ7MŽúƒPN�Õql_ÎóÛ�âù�Fuþã9ÿ±'�ÿh¶Û­n§©wZ½n¿S±cuþ£â¤GvyÙðÆýFüßívËù~ãù�<Û�ŸÿÜêšæ[Ĭø¿:ÿ·šÿ7wþo$ÿ«ó+ù¿„üðÁ{�½Ã{GKñùù¿zÇêæå¿Ñ²ªóßÈuÀBêÒ�6>dÓ|Á b4;+Ú!± ¢$€-)ÊÉdE;™�Ft:ß ÛÑ1Àüà]é(`"¼ž|e“f]ÅG˜I¡5<´CìxçÖš+Ú?’·ÁðÞ ò¾7ö†dŸ1r§xDïæŠv@½qÿ±¥kì{¬±û #ð¢s{§+Úƒ©�ÉÛÆÃãý rß± ½dur†“`c}ýÒ ¯f6Y�᪹æ|2Ï;fü?ñáSLå˃çûül‡î˜}cæí4´ ²y·Ý´V´8So‚=n{@÷ÂÆé|̲gá:ðÍc×:NIðž7„—û{Û»‡'»P>¦#ÏÙ ÃèýÀÃA[Ñî\鄽ËñÝUx²éê¦r~ï¬_雼Â$_~E# ËÚ,|ÊøÚà~Pö妒…ï¬GoÉš ñÔCpqÕ2Þ–ksú©‘_~ëûƒ7œ0zøýª8§*†LÉÕ” î®ÆNRó1 ¼æ”5O×W7QnÜY§ü&'~'’Í�õÉ‚Á*´a2ŸxMz¹>¼¨f1hÙotI‚©“V…Íà W�MÏç�ÖŸ”¨ÜàÉå*´'¼»ú`þ`�<òw•¬oboyË®ƒoS÷’­ÇD²­agL‚ �bCÀ7 ì40�ÙfŽâS‚úû˜ÞŒùF>H`ç‡2–RÍHrxµ¼ú8Xb8ã–�üÆÐ{Â-Ûç›@�tãÉß$§©“O¥ÏrB@‚+*–Š3êiDnõOù¶ãˆ:nßæœ%Øï—úWQã±;â>ão›Ä‘`½¨OÍ'À—Õ„whì™ûûd 2ß>Æ‚ê�' ÒØt ½çYlñ6O�µßþâÓç?ûöÓ �„J: ùë<¬¾Ž “¼1±ýð*�ç?þ›ç?üñçßþ”|þoß{þw?yþ߯e&iíWŸýño¾ýg¿þ�'¿úìïýßùŸ~§µc?]¿GQ G-¸¢Ø©@µ&/Œ?ü (¹D̉UYù%cÄŽ�ìábS±€Š�€ê€Þ,Ò’ƒ Û÷‡ï6üAƒ¯è®Ë‹WëbyßÌ…ÀƒYhH‹9e™‰6à†„hbâŠ2Æ­;¼©Û˜Ði8ÏpgL^'³ÉÄŸââCÞ|ú ÙŽí3¼>!÷ÐŽ‹¯O@YJ©ƒO°|CºÈ5·X^,„K´ ”¹Àe¯�–ÿ.ðÖh™­†®7ôÞ…¨Â×·¤ª$­b4ô¶TÅh´u^*2íhw iÞG b཈î§ÀZì¢þ‰f,ôãtÅ_t�*`¼»¸¸¶¿ZÑ&ÞD¬®/1¢¡lTeÂ-†�ÆÊÒ|öAI àã´�-yP1W·p Æ�Ç• q‚í® Ñ/~+»«°¼™46 t -» ŠÑÂ=z­:1:ÞA¸–”ÍízR«¥«`°f£e)d7)ÀÈeÒe ÙAžÿã§øëGÿÉ¥‰ ¢"9 €o…¬!¿þ§Ÿã¯¿ý)YûÍþ¥�4I·¢éÀiˆ©—φ˜AÈ/:1éÒ¼ë?VÏT Aç§òê0SÉ· Š Ëm肃}‹`ÕF« ÿ–™œ[|2¾Ë§å·ÿú_ÏôNËo?ûÅó?ù9L‹è\6_¹†"°w�5/›‘NÓ»F—cÖã2ÐK¡Å«NÃÐK{ÜÅ=³Úé·KöV¼Lo�?ÿ—Ïxoñ½ç?û”!&ï­D„Él’­áS\€ÂW(FKù_ør!³ØYç’~]ÄŸ=帑A ¿\Cê1àÊ $¬PhCü€ŸÞ¾ þPH"ói0‚áëÍ@²ÅpëÁ'X%m^gÊ„–‹æ†´Z�œ0ÊõXŽy+q‘œM¡·ÞX˜ÿ|£ŽÄðj }tÀðÛ òÇ‘2ý„HÞ–¬ƒRu“U<¢ÌÅb‘ÆÕWÒðC47Uþ|理‘fàKóèsx ÷완’˜´å&\¬h\º�²I.rå/âÏ „�‰,"À¿“X$q¼¡a´ôüŠâG$R…¸½y‰ÍöþÝ——t’‹�àj4vv.êä)Xùä‚äZG'áÿóÅ� ty”Ñ�¤[yåÐŵóü˜©�Z ñBÕHÚFæb9í!#Si�ëpÆf¬¾‹nÄø—Ó5ÿж5@«…J¬ËwîϸC“ì ^c†›ó¸àˆ;áp¾�¬'„ »HWK&w;tŽ¿óD�’åÆÉMR3^rœP&–2>Ø•ÍäȈFÓ< ÄW\ÜΛÏüó‹¸k`ëŽ�+â�%I·ñB*õ82ªQ‹Ä(9{”©�~?ûq¨0;"ùä�ê2ÉŒ?l–>=¡|:—‘XYM³ƒ(|WV@ߪ“žd<å¾™QzAeã"$©Vésš6ª0,P2b¶€€'¹Y@ ¥z<€ì4,j, �m벑FNQDf-z$lŒÈlìm‚Rl<‘«q5ŒâЉcþ>}B#¿ëQˆU�ÜÙڢȭ¢B-rôx» ÊB½‹Ñ”Õª¥}9áúuI|/‚ïã [Îã±ÿtÈÜK†!W>¨ÛiPóQ Pè³Gô@W/S'ô'çCÌö^OÞÕú¿JÿWú¿º¾lú_%V_Hÿ·ZzNÿ›-£]éÿ7qU¬þå¾*ý_éÿJÿWúÿôÿÒ.Òµúø?«ÿÛfˬôÿïlþ+þ¯ô¥ÿ¿|ú¿Óo›m«Òÿ•þçú? ~9þ_ ÿ £epýß¶¬n§ƒüoZ]«Òÿoâzdϼ¡ÛøTgÚ4úŒ‰Ü%�VÎ&¡ïƒÍ»Ýîê™&ÊâÊ< ÜÌ'-ÑäïÎG,¤«šö("œ3mŒF@I%�­j®ø¼‰£‹?k9Ó\iÔ}MŸ®j¸þI4/I¬&CЈ–|À[þ-ת}ƒOöN“{þI–±(›] ü‹EþôH<IvµNø—‰ø°øAâ*ùÃ3m”|Äø@GôñÆ%£^�§ñ‘Ä|´ð‡X�ÌñåÈøK|åýr’ïã8P��Õ|í·Š ­^ó•Ÿ(tý×}¢Ü_õ‰‚ËÍåÏRnΦÃàL‹?þÄÑ~‘54«ZúÅç‹ÃŸy¾hýèCOdPdÚfʾgÚ¸.qRQsëY±^3bà3-^”s—ü¡¡ØëKí@žŸGeÏÏ�H+[£²ÿÛí¢ý¯Wöÿ±ÿ»ªýŸÚ½jû§Êþçb¾é ._ÿ/Œÿ™F6þ§wÌn«²ÿ߈ýÏ./Ï1œ{¶¢…ôòœ›ñ »Åÿ˜â.iáÕŠWª«ºª«ºª«ºª«ºª«ºª«ºª«ºª«ºª«ºª«ºª«ºª«ºª«ºª«ºª«ºª«º¾ˆ×ÿVˆÄ@korean_lunar_calendar_py-0.4.0/korean_lunar_calendar/000077500000000000000000000000001521400542100230375ustar00rootroot00000000000000korean_lunar_calendar_py-0.4.0/korean_lunar_calendar/__init__.py000066400000000000000000000001631521400542100251500ustar00rootroot00000000000000from .korean_lunar_calendar import KoreanLunarCalendar __version__ = '0.4.0' __all__ = [ 'KoreanLunarCalendar' ] korean_lunar_calendar_py-0.4.0/korean_lunar_calendar/korean_lunar_calendar.py000066400000000000000000000652151521400542100277330ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ KoreanLunarCalendar Here is a library to convert Korean lunar-calendar to Gregorian calendar. Korean calendar and Chinese calendar is same lunar calendar but have different date. This follow the KARI(Korea Astronomy and Space Science Institute) @author : usingsky@gmail.com """ import datetime import numbers class KoreanLunarCalendar(object) : KOREAN_LUNAR_MIN_VALUE = 10000101 KOREAN_LUNAR_MAX_VALUE = 20501118 KOREAN_SOLAR_MIN_VALUE = 10000213 KOREAN_SOLAR_MAX_VALUE = 20501231 KOREAN_LUNAR_BASE_YEAR = 1000 SOLAR_LUNAR_DAY_DIFF = 43 LUNAR_SMALL_MONTH_DAY = 29 LUNAR_BIG_MONTH_DAY = 30 SOLAR_SMALL_YEAR_DAY = 365 SOLAR_BIG_YEAR_DAY = 366 SOLAR_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 29] KOREAN_CHEONGAN = [0xac11, 0xc744, 0xbcd1, 0xc815, 0xbb34, 0xae30, 0xacbd, 0xc2e0, 0xc784, 0xacc4] KOREAN_GANJI = [0xc790, 0xcd95, 0xc778, 0xbb18, 0xc9c4, 0xc0ac, 0xc624, 0xbbf8, 0xc2e0, 0xc720, 0xc220, 0xd574] KOREAN_GAPJA_UNIT = [0xb144, 0xc6d4, 0xc77c] CHINESE_CHEONGAN = [0x7532, 0x4e59, 0x4e19, 0x4e01, 0x620a, 0x5df1, 0x5e9a, 0x8f9b, 0x58ec, 0x7678] CHINESE_GANJI = [0x5b50, 0x4e11, 0x5bc5, 0x536f, 0x8fb0, 0x5df3, 0x5348, 0x672a, 0x7533, 0x9149, 0x620c, 0x4ea5] CHINESE_GAPJA_UNIT = [0x5e74, 0x6708, 0x65e5] INTERCALATION_STR = [0xc724, 0x958f] # Offsets that anchor the sexagenary cycle to the base year (1000): the # cheongan (10) and ganji (12) wheels each start at a fixed position. GAPJA_YEAR_CHEONGAN_OFFSET = 6 GAPJA_YEAR_GANJI_OFFSET = 0 GAPJA_MONTH_CHEONGAN_OFFSET = 3 GAPJA_MONTH_GANJI_OFFSET = 1 GAPJA_DAY_CHEONGAN_OFFSET = 4 GAPJA_DAY_GANJI_OFFSET = 2 KOREAN_LUNAR_DATA = [ 0x82c60a57, 0x82fec52b, 0x82c40d2a, 0x82c60d55, 0xc30095ad, 0x82c4056a, 0x82c6096d, 0x830054dd, 0xc2c404ad, 0x82c40a4d, 0x83002e4d, 0x82c40b26, 0xc300ab56, 0x82c60ad5, 0x82c4035a, 0x8300697a, 0xc2c6095b, 0x82c4049b, 0x83004a9b, 0x82c40a4b, 0xc301caa5, 0x82c406aa, 0x82c60ad5, 0x830092dd, 0xc2c402b5, 0x82c60957, 0x82fe54ae, 0x82c60c97, 0xc2c4064b, 0x82ff254a, 0x82c60da9, 0x8300a6b6, 0xc2c6066d, 0x82c4026e, 0x8301692e, 0x82c4092e, 0xc2c40c96, 0x83004d95, 0x82c40d4a, 0x8300cd69, 0xc2c40b58, 0x82c80d6b, 0x8301926b, 0x82c4025d, 0xc2c4092b, 0x83005aab, 0x82c40a95, 0x82c40b4a, 0xc3021eab, 0x82c402d5, 0x8301b55a, 0x82c604bb, 0xc2c4025b, 0x83007537, 0x82c4052b, 0x82c40695, 0xc3003755, 0x82c406aa, 0x8303cab5, 0x82c40275, 0xc2c404b6, 0x83008a5e, 0x82c40a56, 0x82c40d26, 0xc3005ea6, 0x82c60d55, 0x82c405aa, 0x83001d6a, 0xc2c6096d, 0x8300b4af, 0x82c4049d, 0x82c40a4d, 0xc3007d2d, 0x82c40aa6, 0x82c60b55, 0x830045d5, 0xc2c4035a, 0x82c6095d, 0x83011173, 0x82c4045b, 0xc3009a4f, 0x82c4064b, 0x82c40aa5, 0x83006b69, 0xc2c606b5, 0x82c402da, 0x83002ab6, 0x82c60937, 0xc2fec497, 0x82c60c97, 0x82c4064b, 0x82fe86aa, 0xc2c60da5, 0x82c405b4, 0x83034a6d, 0x82c402ae, 0xc2c40e61, 0x83002d2e, 0x82c40c96, 0x83009d4d, 0x82c40d4a, 0x82c60d65, 0x83016595, 0x82c6055d, 0xc2c4026d, 0x83002a5d, 0x82c4092b, 0x8300aa97, 0xc2c40a95, 0x82c40b4a, 0x83008b5a, 0x82c60ad5, 0xc2c6055b, 0x830042b7, 0x82c40457, 0x82c4052b, 0xc3001d2b, 0x82c40695, 0x8300972d, 0x82c405aa, 0xc2c60ab5, 0x830054ed, 0x82c404b6, 0x82c60a57, 0xc2ff344e, 0x82c40d26, 0x8301be92, 0x82c60d55, 0xc2c405aa, 0x830089ba, 0x82c6096d, 0x82c404ae, 0xc3004a9d, 0x82c40a4d, 0x82c40d25, 0x83002f25, 0xc2c40b54, 0x8303ad69, 0x82c402da, 0x82c6095d, 0xc301649b, 0x82c4049b, 0x82c40a4b, 0x83004b4b, 0xc2c406a5, 0x8300bb53, 0x82c406b4, 0x82c60ab6, 0xc3018956, 0x82c60997, 0x82c40497, 0x83004697, 0xc2c4054b, 0x82fec6a5, 0x82c60da5, 0x82c405ac, 0xc303aab5, 0x82c4026e, 0x82c4092e, 0x83006cae, 0xc2c40c96, 0x82c40d4a, 0x83002f4a, 0x82c60d55, 0xc300b56b, 0x82c6055b, 0x82c4025d, 0x8300793d, 0xc2c40927, 0x82c40a95, 0x83015d15, 0x82c40b4a, 0xc2c60b55, 0x830112d5, 0x82c604db, 0x82fe925e, 0xc2c60a57, 0x82c4052b, 0x83006aab, 0x82c40695, 0xc2c406aa, 0x83003baa, 0x82c60ab5, 0x8300b4b7, 0xc2c404ae, 0x82c60a57, 0x82fe752e, 0x82c40d26, 0xc2c60e93, 0x830056d5, 0x82c405aa, 0x82c609b5, 0xc300256d, 0x82c404ae, 0x8301aa4d, 0x82c40a4d, 0xc2c40d26, 0x83006d65, 0x82c40b52, 0x82c60d6a, 0xc30026da, 0x82c6095d, 0x8301c49d, 0x82c4049b, 0xc2c40a4b, 0x83008aab, 0x82c406a5, 0x82c40b54, 0xc3004bb4, 0x82c60ab6, 0x82c6095b, 0x83002537, 0xc2c40497, 0x8300964f, 0x82c4054b, 0x82c406a5, 0xc30176c5, 0x82c405ac, 0x82c60ab6, 0x8301386e, 0xc2c4092e, 0x8300cc97, 0x82c40c96, 0x82c40d4a, 0xc3008daa, 0x82c60b55, 0x82c4056a, 0x83025adb, 0xc2c4025d, 0x82c4092e, 0x83002d2b, 0x82c40a95, 0xc3009d4d, 0x82c40b2a, 0x82c60b55, 0x83007575, 0xc2c404da, 0x82c60a5b, 0x83004557, 0x82c4052b, 0xc301ca93, 0x82c40693, 0x82c406aa, 0x83008ada, 0xc2c60ae5, 0x82c404b6, 0x83004aae, 0x82c60a57, 0xc2c40527, 0x82ff2526, 0x82c60e53, 0x8300a6cb, 0xc2c405aa, 0x82c605ad, 0x830164ad, 0x82c404ae, 0xc2c40a4e, 0x83004d4d, 0x82c40d26, 0x8300bd53, 0xc2c40b52, 0x82c60b6a, 0x8301956a, 0x82c60557, 0xc2c4049d, 0x83015a1b, 0x82c40a4b, 0x82c40aa5, 0xc3001ea5, 0x82c40b52, 0x8300bb5a, 0x82c60ab6, 0xc2c6095b, 0x830064b7, 0x82c40497, 0x82c4064b, 0xc300374b, 0x82c406a5, 0x8300b6b3, 0x82c405ac, 0xc2c60ab6, 0x830182ad, 0x82c4049e, 0x82c40a4d, 0xc3005d4b, 0x82c40b25, 0x82c40b52, 0x83012e52, 0xc2c60b5a, 0x8300a95e, 0x82c6095b, 0x82c4049b, 0xc3006a57, 0x82c40a4b, 0x82c40aa5, 0x83004ba5, 0xc2c406d4, 0x8300cad6, 0x82c60ab6, 0x82c60937, 0x8300849f, 0x82c40497, 0x82c4064b, 0x82fe56ca, 0xc2c60da5, 0x82c405aa, 0x83001d6c, 0x82c60a6e, 0xc300b92f, 0x82c4092e, 0x82c40c96, 0x83007d55, 0xc2c40d4a, 0x82c60d55, 0x83013555, 0x82c4056a, 0xc2c60a6d, 0x83001a5d, 0x82c4092b, 0x83008a5b, 0xc2c40a95, 0x82c40b2a, 0x83015b2a, 0x82c60ad5, 0xc2c404da, 0x83001cba, 0x82c60a57, 0x8300952f, 0xc2c40527, 0x82c40693, 0x830076b3, 0x82c406aa, 0xc2c60ab5, 0x83003575, 0x82c404b6, 0x8300ca67, 0xc2c40a2e, 0x82c40d16, 0x83008e96, 0x82c40d4a, 0xc2c60daa, 0x830055ea, 0x82c6056d, 0x82c404ae, 0xc301285d, 0x82c40a2d, 0x8300ad17, 0x82c40aa5, 0xc2c40b52, 0x83007d74, 0x82c60ada, 0x82c6055d, 0xc300353b, 0x82c4045b, 0x82c40a2b, 0x83011a2b, 0xc2c40aa5, 0x83009b55, 0x82c406b2, 0x82c60ad6, 0xc3015536, 0x82c60937, 0x82c40457, 0x83003a57, 0xc2c4052b, 0x82feaaa6, 0x82c60d95, 0x82c405aa, 0xc3017aac, 0x82c60a6e, 0x82c4052e, 0x83003cae, 0xc2c40a56, 0x8300bd2b, 0x82c40d2a, 0x82c60d55, 0xc30095ad, 0x82c4056a, 0x82c60a6d, 0x8300555d, 0xc2c4052b, 0x82c40a8d, 0x83002e55, 0x82c40b2a, 0xc300ab56, 0x82c60ad5, 0x82c404da, 0x83006a7a, 0xc2c60a57, 0x82c4051b, 0x83014a17, 0x82c40653, 0xc301c6a9, 0x82c405aa, 0x82c60ab5, 0x830092bd, 0xc2c402b6, 0x82c60a37, 0x82fe552e, 0x82c40d16, 0x82c60e4b, 0x82fe3752, 0x82c60daa, 0x8301b5b4, 0xc2c6056d, 0x82c402ae, 0x83007a3d, 0x82c40a2d, 0xc2c40d15, 0x83004d95, 0x82c40b52, 0x8300cb69, 0xc2c60ada, 0x82c6055d, 0x8301925b, 0x82c4045b, 0xc2c40a2b, 0x83005aab, 0x82c40a95, 0x82c40b52, 0xc3001eaa, 0x82c60ab6, 0x8300c55b, 0x82c604b7, 0xc2c40457, 0x83007537, 0x82c4052b, 0x82c40695, 0xc3014695, 0x82c405aa, 0x8300cab5, 0x82c60a6e, 0xc2c404ae, 0x83008a5e, 0x82c40a56, 0x82c40d2a, 0xc3006eaa, 0x82c60d55, 0x82c4056a, 0x8301295a, 0xc2c6095d, 0x8300b4af, 0x82c4049b, 0x82c40a4d, 0xc3007d2d, 0x82c40b2a, 0x82c60b55, 0x830045d5, 0xc2c402da, 0x82c6095b, 0x83011157, 0x82c4049b, 0xc3009a4f, 0x82c4064b, 0x82c406a9, 0x83006aea, 0xc2c606b5, 0x82c402b6, 0x83002aae, 0x82c60937, 0xc2ffb496, 0x82c40c96, 0x82c60e4b, 0x82fe76b2, 0xc2c60daa, 0x82c605ad, 0x8300336d, 0x82c4026e, 0xc2c4092e, 0x83002d2d, 0x82c40c95, 0x83009d4d, 0xc2c40b4a, 0x82c60b69, 0x8301655a, 0x82c6055b, 0xc2c4025d, 0x83002a5b, 0x82c4092b, 0x8300aa97, 0xc2c40695, 0x82c4074a, 0x83008b5a, 0x82c60ab6, 0xc2c6053b, 0x830042b7, 0x82c40257, 0x82c4052b, 0xc3001d2b, 0x82c40695, 0x830096ad, 0x82c405aa, 0xc2c60ab5, 0x830054ed, 0x82c404ae, 0x82c60a57, 0xc2ff344e, 0x82c40d2a, 0x8301bd94, 0x82c60b55, 0x82c4056a, 0x8300797a, 0x82c6095d, 0x82c404ae, 0xc3004a9b, 0x82c40a4d, 0x82c40d25, 0x83011aaa, 0xc2c60b55, 0x8300956d, 0x82c402da, 0x82c6095b, 0xc30054b7, 0x82c40497, 0x82c40a4b, 0x83004b4b, 0xc2c406a9, 0x8300cad5, 0x82c605b5, 0x82c402b6, 0xc300895e, 0x82c6092f, 0x82c40497, 0x82fe4696, 0xc2c40d4a, 0x8300cea5, 0x82c60d69, 0x82c6056d, 0xc301a2b5, 0x82c4026e, 0x82c4092e, 0x83006cad, 0xc2c40c95, 0x82c40d4a, 0x83002f4a, 0x82c60b59, 0xc300c56d, 0x82c6055b, 0x82c4025d, 0x8300793b, 0xc2c4092b, 0x82c40a95, 0x83015b15, 0x82c406ca, 0xc2c60ad5, 0x830112b6, 0x82c604bb, 0x8300925f, 0xc2c40257, 0x82c4052b, 0x82fe6aaa, 0x82c60e95, 0xc2c406aa, 0x83003baa, 0x82c60ab5, 0x8300b4b7, 0xc2c404ae, 0x82c60a57, 0x82fe752d, 0x82c40d26, 0xc2c60d95, 0x830055d5, 0x82c4056a, 0x82c6096d, 0xc300255d, 0x82c404ae, 0x8300aa4f, 0x82c40a4d, 0xc2c40d25, 0x83006d69, 0x82c60b55, 0x82c4035a, 0xc3002aba, 0x82c6095b, 0x8301c49b, 0x82c40497, 0xc2c40a4b, 0x83008b2b, 0x82c406a5, 0x82c406d4, 0xc3034ab5, 0x82c402b6, 0x82c60937, 0x8300252f, 0xc2c40497, 0x82fe964e, 0x82c40d4a, 0x82c60ea5, 0xc30166a9, 0x82c6056d, 0x82c402b6, 0x8301385e, 0xc2c4092e, 0x8300bc97, 0x82c40a95, 0x82c40d4a, 0xc3008daa, 0x82c60b4d, 0x82c6056b, 0x830042db, 0xc2c4025d, 0x82c4092d, 0x83002d2b, 0x82c40a95, 0xc3009b4d, 0x82c406aa, 0x82c60ad5, 0x83006575, 0xc2c604bb, 0x82c4025b, 0x83013457, 0x82c4052b, 0xc2ffba94, 0x82c60e95, 0x82c406aa, 0x83008ada, 0xc2c609b5, 0x82c404b6, 0x83004aae, 0x82c60a4f, 0xc2c20526, 0x83012d26, 0x82c60d55, 0x8301a5a9, 0xc2c4056a, 0x82c6096d, 0x8301649d, 0x82c4049e, 0xc2c40a4d, 0x83004d4d, 0x82c40d25, 0x8300bd53, 0xc2c40b54, 0x82c60b5a, 0x8301895a, 0x82c6095b, 0xc2c4049b, 0x83004a97, 0x82c40a4b, 0x82c40aa5, 0xc3001ea5, 0x82c406d4, 0x8302badb, 0x82c402b6, 0xc2c60937, 0x830064af, 0x82c40497, 0x82c4064b, 0xc2fe374a, 0x82c60da5, 0x8300b6b5, 0x82c6056d, 0xc2c402ae, 0x8300793e, 0x82c4092e, 0x82c40c96, 0xc3015d15, 0x82c40d4a, 0x82c60da5, 0x83013555, 0xc2c4056a, 0x83007a7a, 0x82c60a5d, 0x82c4092d, 0xc3006aab, 0x82c40a95, 0x82c40b4a, 0x83004baa, 0xc2c60ad5, 0x82c4055a, 0x830128ba, 0x82c60a5b, 0xc3007537, 0x82c4052b, 0x82c40693, 0x83015715, 0xc2c406aa, 0x82c60ad5, 0x830035b5, 0x82c404b6, 0xc3008a5e, 0x82c40a4e, 0x82c40d26, 0x83006ea6, 0xc2c40d52, 0x82c60daa, 0x8301466a, 0x82c6056d, 0xc2c404ae, 0x83003a9d, 0x82c40a4d, 0x83007d2b, 0xc2c40b25, 0x82c40d52, 0x83015d54, 0x82c60b5a, 0xc2c6055d, 0x8300355b, 0x82c4049b, 0x83007657, 0x82c40a4b, 0x82c40aa5, 0x83006b65, 0x82c406d2, 0xc2c60ada, 0x830045b6, 0x82c60937, 0x82c40497, 0xc3003697, 0x82c4064d, 0x82fe76aa, 0x82c60da5, 0xc2c405aa, 0x83005aec, 0x82c60aae, 0x82c4092e, 0xc3003d2e, 0x82c40c96, 0x83018d45, 0x82c40d4a, 0xc2c60d55, 0x83016595, 0x82c4056a, 0x82c60a6d, 0xc300455d, 0x82c4052d, 0x82c40a95, 0x83013c95, 0xc2c40b4a, 0x83017b4a, 0x82c60ad5, 0x82c4055a, 0xc3015a3a, 0x82c60a5b, 0x82c4052b, 0x83014a17, 0xc2c40693, 0x830096ab, 0x82c406aa, 0x82c60ab5, 0xc30064f5, 0x82c404b6, 0x82c60a57, 0x82fe452e, 0xc2c40d16, 0x82c60e93, 0x82fe3752, 0x82c60daa, 0xc30175aa, 0x82c6056d, 0x82c404ae, 0x83015a1d, 0xc2c40a2d, 0x82c40d15, 0x83004da5, 0x82c40b52, 0xc3009d6a, 0x82c60ada, 0x82c6055d, 0x8301629b, 0xc2c4045b, 0x82c40a2b, 0x83005b2b, 0x82c40a95, 0xc2c40b52, 0x83012ab2, 0x82c60ad6, 0x83017556, 0xc2c60537, 0x82c40457, 0x83005657, 0x82c4052b, 0xc2c40695, 0x83003795, 0x82c405aa, 0x8300aab6, 0xc2c60a6d, 0x82c404ae, 0x83006a6e, 0x82c40a56, 0xc2c40d2a, 0x83005eaa, 0x82c60d55, 0x82c405aa, 0xc3003b6a, 0x82c60a6d, 0x830074bd, 0x82c404ab, 0xc2c40a8d, 0x83005d55, 0x82c40b2a, 0x82c60b55, 0xc30045d5, 0x82c404da, 0x82c6095d, 0x83002557, 0xc2c4049b, 0x83006a97, 0x82c4064b, 0x82c406a9, 0x83004baa, 0x82c606b5, 0x82c402ba, 0x83002ab6, 0xc2c60937, 0x82fe652e, 0x82c40d16, 0x82c60e4b, 0xc2fe56d2, 0x82c60da9, 0x82c605b5, 0x8300336d, 0xc2c402ae, 0x82c40a2e, 0x83002e2d, 0x82c40c95, 0xc3006d55, 0x82c40b52, 0x82c60b69, 0x830045da, 0xc2c6055d, 0x82c4025d, 0x83003a5b, 0x82c40a2b, 0xc3017a8b, 0x82c40a95, 0x82c40b4a, 0x83015b2a, 0xc2c60ad5, 0x82c6055b, 0x830042b7, 0x82c40257, 0xc300952f, 0x82c4052b, 0x82c40695, 0x830066d5, 0xc2c405aa, 0x82c60ab5, 0x8300456d, 0x82c404ae, 0xc2c60a57, 0x82ff3456, 0x82c40d2a, 0x83017e8a, 0xc2c60d55, 0x82c405aa, 0x83005ada, 0x82c6095d, 0xc2c404ae, 0x83004aab, 0x82c40a4d, 0x83008d2b, 0xc2c40b29, 0x82c60b55, 0x83007575, 0x82c402da, 0xc2c6095d, 0x830054d7, 0x82c4049b, 0x82c40a4b, 0xc3013a4b, 0x82c406a9, 0x83008ad9, 0x82c606b5, 0xc2c402b6, 0x83015936, 0x82c60937, 0x82c40497, 0xc2fe4696, 0x82c40e4a, 0x8300aea6, 0x82c60da9, 0xc2c605ad, 0x830162ad, 0x82c402ae, 0x82c4092e, 0xc3005cad, 0x82c40c95, 0x82c40d4a, 0x83013d4a, 0xc2c60b69, 0x8300757a, 0x82c6055b, 0x82c4025d, 0xc300595b, 0x82c4092b, 0x82c40a95, 0x83004d95, 0xc2c40b4a, 0x82c60b55, 0x830026d5, 0x82c6055b, 0xc3006277, 0x82c40257, 0x82c4052b, 0x82fe5aaa, 0xc2c60e95, 0x82c406aa, 0x83003baa, 0x82c60ab5, 0x830084bd, 0x82c404ae, 0x82c60a57, 0x82fe554d, 0xc2c40d26, 0x82c60d95, 0x83014655, 0x82c4056a, 0xc2c609ad, 0x8300255d, 0x82c404ae, 0x83006a5b, 0xc2c40a4d, 0x82c40d25, 0x83005da9, 0x82c60b55, 0xc2c4056a, 0x83002ada, 0x82c6095d, 0x830074bb, 0xc2c4049b, 0x82c40a4b, 0x83005b4b, 0x82c406a9, 0xc2c40ad4, 0x83024bb5, 0x82c402b6, 0x82c6095b, 0xc3002537, 0x82c40497, 0x82fe6656, 0x82c40e4a, 0xc2c60ea5, 0x830156a9, 0x82c605b5, 0x82c402b6, 0xc30138ae, 0x82c4092e, 0x83017c8d, 0x82c40c95, 0xc2c40d4a, 0x83016d8a, 0x82c60b69, 0x82c6056d, 0xc301425b, 0x82c4025d, 0x82c4092d, 0x83002d2b, 0xc2c40a95, 0x83007d55, 0x82c40b4a, 0x82c60b55, 0xc3015555, 0x82c604db, 0x82c4025b, 0x83013857, 0xc2c4052b, 0x83008a9b, 0x82c40695, 0x82c406aa, 0xc3006aea, 0x82c60ab5, 0x82c404b6, 0x83004aae, 0xc2c60a57, 0x82c40527, 0x82fe3726, 0x82c60d95, 0xc30076b5, 0x82c4056a, 0x82c609ad, 0x830054dd, 0xc2c404ae, 0x82c40a4e, 0x83004d4d, 0x82c40d25, 0xc3008d59, 0x82c40b54, 0x82c60d6a, 0x8301695a, 0xc2c6095b, 0x82c4049b, 0x83004a9b, 0x82c40a4b, 0xc300ab27, 0x82c406a5, 0x82c406d4, 0x83026b75, 0xc2c402b6, 0x82c6095b, 0x830054b7, 0x82c40497, 0xc2c4064b, 0x82fe374a, 0x82c60ea5, 0x830086d9, 0xc2c605ad, 0x82c402b6, 0x8300596e, 0x82c4092e, 0xc2c40c96, 0x83004e95, 0x82c40d4a, 0x82c60da5, 0xc3002755, 0x82c4056c, 0x83027abb, 0x82c4025d, 0xc2c4092d, 0x83005cab, 0x82c40a95, 0x82c40b4a, 0xc3013b4a, 0x82c60b55, 0x8300955d, 0x82c404ba, 0xc2c60a5b, 0x83005557, 0x82c4052b, 0x82c40a95, 0xc3004b95, 0x82c406aa, 0x82c60ad5, 0x830026b5, 0xc2c404b6, 0x83006a6e, 0x82c60a57, 0x82c40527, 0xc2fe56a6, 0x82c60d93, 0x82c405aa, 0x83003b6a, 0xc2c6096d, 0x8300b4af, 0x82c404ae, 0x82c40a4d, 0xc3016d0d, 0x82c40d25, 0x82c40d52, 0x83005dd4, 0xc2c60b6a, 0x82c6096d, 0x8300255b, 0x82c4049b, 0xc3007a57, 0x82c40a4b, 0x82c40b25, 0x83015b25, 0xc2c406d4, 0x82c60ada, 0x830138b6] def __init__(self): self.lunarYear = 0 self.lunarMonth = 0 self.lunarDay = 0 self.isIntercalation = False self.solarYear = 0 self.solarMonth = 0 self.solarDay = 0 # Memoized cumulative day counts from the base year, so the repeated # lookups inside the month-search loops don't re-sum ~1000 years. self.__cumulativeLunarDays = {} self.__cumulativeSolarDays = {} # Default to today's solar date until an explicit date is set. today = datetime.date.today() self.setSolarDate(today.year, today.month, today.day) def LunarIsoFormat(self): dateStr = "%04d-%02d-%02d" % (self.lunarYear, self.lunarMonth, self.lunarDay) if self.isIntercalation : dateStr += " Intercalation" return dateStr def SolarIsoFormat(self): return "%04d-%02d-%02d" % (self.solarYear, self.solarMonth, self.solarDay) def __getLunarData(self, year): return self.KOREAN_LUNAR_DATA[year - self.KOREAN_LUNAR_BASE_YEAR] def __getLunarIntercalationMonth(self, lunarData): return (lunarData >> 12) & 0x000F def __getLunarDays(self, year, month=None, isIntercalation=None): lunarData = self.__getLunarData(year) if month is not None and isIntercalation is not None : if (isIntercalation == True) and (self.__getLunarIntercalationMonth(lunarData) == month): days = self.LUNAR_BIG_MONTH_DAY if ((lunarData >>16) & 0x01) > 0 else self.LUNAR_SMALL_MONTH_DAY else: days = self.LUNAR_BIG_MONTH_DAY if ((lunarData >> (12 - month)) & 0x01) > 0 else self.LUNAR_SMALL_MONTH_DAY else: days = (lunarData >> 17) & 0x01FF return days def __accumulateYearDays(self, year, cache, perYearFn): # Sum of per-year day counts from the base year through `year`, memoized. # Extends the previous year's cached sum when available (amortized O(1)), # otherwise sums from the base year once and caches the total. if year in cache: return cache[year] if (year - 1) in cache and year > self.KOREAN_LUNAR_BASE_YEAR: days = cache[year - 1] + perYearFn(year) else: days = 0 for baseYear in range(self.KOREAN_LUNAR_BASE_YEAR, year+1): days += perYearFn(baseYear) cache[year] = days return days def __getLunarDaysBeforeBaseYear(self, year): return self.__accumulateYearDays(year, self.__cumulativeLunarDays, lambda y: self.__getLunarDays(y)) def __getLunarDaysBeforeBaseMonth(self, year, month, isIntercalation): days = 0 if (year >= self.KOREAN_LUNAR_BASE_YEAR) and (month > 0): for baseMonth in range(1, month+1): days += self.__getLunarDays(year, baseMonth, False) if isIntercalation == True: intercalationMonth = self.__getLunarIntercalationMonth(self.__getLunarData(year)) if (intercalationMonth > 0) and intercalationMonth < month+1: days += self.__getLunarDays(year, intercalationMonth, True) return days def __getLunarAbsDays(self, year, month, day, isIntercalation): days = self.__getLunarDaysBeforeBaseYear(year-1) + self.__getLunarDaysBeforeBaseMonth(year, month-1, True) + day if (isIntercalation == True) and (self.__getLunarIntercalationMonth(self.__getLunarData(year)) == month): days += self.__getLunarDays(year, month, False) return days def __isSolarIntercalationYear(self, lunarData): return ((lunarData >> 30) & 0x01) > 0 def __getSolarDays(self, year, month=None): lunarData = self.__getLunarData(year) if month is not None : days = self.SOLAR_DAYS[12] if (month == 2) and self.__isSolarIntercalationYear(lunarData) else self.SOLAR_DAYS[month - 1] else: days = self.SOLAR_BIG_YEAR_DAY if self.__isSolarIntercalationYear(lunarData) else self.SOLAR_SMALL_YEAR_DAY return days def __getSolarDaysBeforeBaseYear(self, year): return self.__accumulateYearDays(year, self.__cumulativeSolarDays, lambda y: self.__getSolarDays(y)) def __getSolarDaysBeforeBaseMonth(self, year, month): days = 0 for baseMonth in range(1, month+1): days += self.__getSolarDays(year, baseMonth) return days def __getSolarAbsDays(self, year, month, day): days = self.__getSolarDaysBeforeBaseYear(year-1) + self.__getSolarDaysBeforeBaseMonth(year, month-1) + day days -= self.SOLAR_LUNAR_DAY_DIFF return days def __setSolarDateByLunarDate(self, lunarYear, lunarMonth, lunarDay, isIntercalation): absDays = self.__getLunarAbsDays(lunarYear, lunarMonth, lunarDay, isIntercalation) solarYear = 0 solarMonth = 0 solarDay = 0 solarYear = lunarYear if (absDays < self.__getSolarAbsDays(lunarYear+1, 1, 1)) else lunarYear+1 for month in range(12, 0, -1) : absDaysByMonth = self.__getSolarAbsDays(solarYear, month, 1) if (absDays >= absDaysByMonth) : solarMonth = month solarDay = absDays - absDaysByMonth +1 break self.solarYear = solarYear self.solarMonth = solarMonth self.solarDay = solarDay def __setLunarDateBySolarDate(self, solarYear, solarMonth, solarDay): absDays = self.__getSolarAbsDays(solarYear, solarMonth, solarDay) lunarYear = solarYear if (absDays >= self.__getLunarAbsDays(solarYear, 1, 1, False)) else solarYear-1 lunarMonth = 0 lunarDay = 0 isIntercalation = False for month in range(12, 0, -1) : absDaysByMonth = self.__getLunarAbsDays(lunarYear, month, 1, False) if absDays >= absDaysByMonth: lunarMonth = month if self.__getLunarIntercalationMonth(self.__getLunarData(lunarYear)) == month : isIntercalation = absDays >= self.__getLunarAbsDays(lunarYear, month, 1, True) lunarDay = absDays - self.__getLunarAbsDays(lunarYear, lunarMonth, 1, isIntercalation) + 1 break self.lunarYear = lunarYear self.lunarMonth = lunarMonth self.lunarDay = lunarDay self.isIntercalation = isIntercalation def __checkValidDate(self, isLunar, isIntercalation, year, month, day): isValid = False # Reject non-integer inputs before they corrupt the bitfield/index math. if not all(isinstance(value, numbers.Integral) for value in (year, month, day)): return isValid dateValue = year*10000 + month*100 + day #1582. 10. 5 ~ 1582. 10. 14 is not valid minValue = self.KOREAN_LUNAR_MIN_VALUE if isLunar else self.KOREAN_SOLAR_MIN_VALUE maxValue = self.KOREAN_LUNAR_MAX_VALUE if isLunar else self.KOREAN_SOLAR_MAX_VALUE if minValue <= dateValue and maxValue >= dateValue : if month > 0 and month < 13 and day > 0 : # A leap-month request is only valid when this year's actual # intercalation month matches the requested month. if isLunar and isIntercalation and (self.__getLunarIntercalationMonth(self.__getLunarData(year)) != month) : return isValid dayLimit = self.__getLunarDays(year, month, isIntercalation) if isLunar else self.__getSolarDays(year, month) # 1582.10.5 ~ 1582.10.14 were skipped by the Gregorian reform; the # month still ends at day 31, so only those 10 days are rejected. if isLunar == False and year == 1582 and month == 10 and day > 4 and day < 15 : return isValid if day <= dayLimit : isValid = True return isValid def setLunarDate(self, lunarYear, lunarMonth, lunarDay, isIntercalation) : isValid = False if self.__checkValidDate(True, isIntercalation, lunarYear, lunarMonth, lunarDay): self.lunarYear = lunarYear self.lunarMonth = lunarMonth self.lunarDay = lunarDay self.isIntercalation = isIntercalation and (self.__getLunarIntercalationMonth(self.__getLunarData(lunarYear)) == lunarMonth) self.__setSolarDateByLunarDate(lunarYear, lunarMonth, lunarDay, isIntercalation) isValid = True return isValid def setSolarDate(self, solarYear, solarMonth, solarDay): isValid = False if self.__checkValidDate(False, False, solarYear, solarMonth, solarDay) : self.solarYear = solarYear self.solarMonth = solarMonth self.solarDay = solarDay self.__setLunarDateBySolarDate(solarYear, solarMonth, solarDay) isValid = True return isValid def __getGapJa(self): # Sexagenary-cycle indices for the current lunar date as # ((yearCheongan, yearGanji), (monthCheongan, monthGanji), (dayCheongan, dayGanji)). # Pure: returns a fresh tuple instead of mutating instance state. When no # valid date is set (absDays <= 0) it returns the zero indices, preserving # the historical default for an unset converter. absDays = self.__getLunarAbsDays(self.lunarYear, self.lunarMonth, self.lunarDay, self.isIntercalation) if absDays <= 0 : return ((0, 0), (0, 0), (0, 0)) cheonganLen = len(self.KOREAN_CHEONGAN) ganjiLen = len(self.KOREAN_GANJI) monthCount = self.lunarMonth + 12 * (self.lunarYear - self.KOREAN_LUNAR_BASE_YEAR) yearInx = (((self.lunarYear + self.GAPJA_YEAR_CHEONGAN_OFFSET) - self.KOREAN_LUNAR_BASE_YEAR) % cheonganLen, ((self.lunarYear + self.GAPJA_YEAR_GANJI_OFFSET) - self.KOREAN_LUNAR_BASE_YEAR) % ganjiLen) monthInx = ((monthCount + self.GAPJA_MONTH_CHEONGAN_OFFSET) % cheonganLen, (monthCount + self.GAPJA_MONTH_GANJI_OFFSET) % ganjiLen) dayInx = ((absDays + self.GAPJA_DAY_CHEONGAN_OFFSET) % cheonganLen, (absDays + self.GAPJA_DAY_GANJI_OFFSET) % ganjiLen) return (yearInx, monthInx, dayInx) def getGapJaString(self) : (yearInx, monthInx, dayInx) = self.__getGapJa() gapjaStr = "%c%c%c %c%c%c %c%c%c" % (chr(self.KOREAN_CHEONGAN[yearInx[0]]), chr(self.KOREAN_GANJI[yearInx[1]]), chr(self.KOREAN_GAPJA_UNIT[0]), chr(self.KOREAN_CHEONGAN[monthInx[0]]), chr(self.KOREAN_GANJI[monthInx[1]]), chr(self.KOREAN_GAPJA_UNIT[1]), chr(self.KOREAN_CHEONGAN[dayInx[0]]), chr(self.KOREAN_GANJI[dayInx[1]]), chr(self.KOREAN_GAPJA_UNIT[2])) if self.isIntercalation == True : gapjaStr += " (%c%c)" % (chr(self.INTERCALATION_STR[0]), chr(self.KOREAN_GAPJA_UNIT[1])) return gapjaStr def getChineseGapJaString(self) : (yearInx, monthInx, dayInx) = self.__getGapJa() gapjaStr = "%c%c%c %c%c%c %c%c%c" % (chr(self.CHINESE_CHEONGAN[yearInx[0]]), chr(self.CHINESE_GANJI[yearInx[1]]), chr(self.CHINESE_GAPJA_UNIT[0]), chr(self.CHINESE_CHEONGAN[monthInx[0]]), chr(self.CHINESE_GANJI[monthInx[1]]), chr(self.CHINESE_GAPJA_UNIT[1]), chr(self.CHINESE_CHEONGAN[dayInx[0]]), chr(self.CHINESE_GANJI[dayInx[1]]), chr(self.CHINESE_GAPJA_UNIT[2])) if self.isIntercalation == True : gapjaStr += " (%c%c)" % (chr(self.INTERCALATION_STR[1]), chr(self.CHINESE_GAPJA_UNIT[1])) return gapjaStr korean_lunar_calendar_py-0.4.0/pyproject.toml000066400000000000000000000022021521400542100214360ustar00rootroot00000000000000[build-system] requires = ["setuptools>=77"] build-backend = "setuptools.build_meta" [project] name = "korean_lunar_calendar" dynamic = ["version"] description = "Convert the Korean lunar calendar to/from the Gregorian solar calendar (KARI standard)." readme = "README.md" requires-python = ">=3.6" license = "MIT" license-files = ["LICENSE"] authors = [{ name = "Jinil Lee", email = "usingsky@gmail.com" }] maintainers = [{ name = "Jinil Lee", email = "usingsky@gmail.com" }] keywords = ["calendar", "korean", "lunar", "solar", "ì�Œë ¥", "ì–‘ë ¥", "달력"] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries", ] [project.urls] Homepage = "https://github.com/usingsky/korean_lunar_calendar_py" Repository = "https://github.com/usingsky/korean_lunar_calendar_py" Issues = "https://github.com/usingsky/korean_lunar_calendar_py/issues" [tool.setuptools] packages = ["korean_lunar_calendar"] [tool.setuptools.dynamic] version = { attr = "korean_lunar_calendar.__version__" } korean_lunar_calendar_py-0.4.0/test_korean_lunar_calendar.py000066400000000000000000000105151521400542100244520ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ Tests for KoreanLunarCalendar. Run from this directory: python -m unittest -v Expected values are taken from the KARI standard (cross-checked against the JavaScript/Java ports of this library). """ import datetime import os import sys import unittest sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from korean_lunar_calendar import KoreanLunarCalendar class SolarToLunarTest(unittest.TestCase): def test_known_conversions(self): cal = KoreanLunarCalendar() self.assertTrue(cal.setSolarDate(2017, 6, 24)) self.assertEqual(cal.LunarIsoFormat(), "2017-05-01 Intercalation") self.assertEqual(cal.getGapJaString(), "정유년 병오월 임오ì�¼ (윤월)") self.assertEqual(cal.getChineseGapJaString(), "ä¸�酉年 丙å�ˆæœˆ 壬å�ˆæ—¥ (é–�月)") self.assertTrue(cal.setSolarDate(1956, 3, 3)) self.assertEqual(cal.LunarIsoFormat(), "1956-01-21") self.assertEqual(cal.getGapJaString(), "병신년 ê²½ì�¸ì›” 기사ì�¼") self.assertEqual(cal.getChineseGapJaString(), "丙申年 庚寅月 己巳日") self.assertTrue(cal.setSolarDate(1000, 2, 13)) # minimum supported solar date self.assertEqual(cal.LunarIsoFormat(), "1000-01-01") self.assertEqual(cal.getGapJaString(), "ê²½ìž�ë…„ 무ì�¸ì›” 기묘ì�¼") self.assertTrue(cal.setSolarDate(2050, 12, 31)) # maximum supported solar date self.assertEqual(cal.LunarIsoFormat(), "2050-11-18") self.assertEqual(cal.getGapJaString(), "경오년 무ìž�ì›” ì�„유ì�¼") self.assertTrue(cal.setSolarDate(1727, 4, 21)) # falls on a leap-month lunar date self.assertEqual(cal.LunarIsoFormat(), "1727-03-01 Intercalation") self.assertEqual(cal.getGapJaString(), "정미년 ê°‘ì§„ì›” 정사ì�¼ (윤월)") self.assertEqual(cal.getChineseGapJaString(), "ä¸�未年 甲辰月 ä¸�巳日 (é–�月)") class LunarToSolarTest(unittest.TestCase): def test_known_conversions(self): cal = KoreanLunarCalendar() self.assertTrue(cal.setLunarDate(2017, 5, 1, True)) # intercalation (leap) month self.assertEqual(cal.SolarIsoFormat(), "2017-06-24") self.assertTrue(cal.setLunarDate(1956, 1, 21, False)) self.assertEqual(cal.SolarIsoFormat(), "1956-03-03") self.assertTrue(cal.setLunarDate(1320, 11, 24, False)) self.assertEqual(cal.SolarIsoFormat(), "1321-01-01") # Leap (intercalation) month: lunar 1727-03-01 (leap) -> solar 1727-04-21 self.assertTrue(cal.setLunarDate(1727, 3, 1, True)) self.assertEqual(cal.SolarIsoFormat(), "1727-04-21") self.assertEqual(cal.getGapJaString(), "정미년 ê°‘ì§„ì›” 정사ì�¼ (윤월)") class DefaultDateTest(unittest.TestCase): def test_defaults_to_today(self): cal = KoreanLunarCalendar() today = datetime.date.today() self.assertEqual(cal.solarYear, today.year) self.assertEqual(cal.solarMonth, today.month) self.assertEqual(cal.solarDay, today.day) class ValidationTest(unittest.TestCase): def test_invalid_dates_rejected(self): cal = KoreanLunarCalendar() # Out of supported range. self.assertFalse(cal.setLunarDate(999, 1, 1, False)) self.assertFalse(cal.setSolarDate(2051, 1, 1)) # 1582.10.5 ~ 1582.10.14 were removed by the Gregorian reform. self.assertFalse(cal.setSolarDate(1582, 10, 8)) # October 1582 still ends at day 31; days beyond that must be rejected. self.assertFalse(cal.setSolarDate(1582, 10, 35)) # A leap month can only be requested when the year actually has one in # that position; month 3 of 2017 is not a leap month. self.assertFalse(cal.setLunarDate(2017, 3, 1, True)) # Non-integer inputs are rejected instead of corrupting the math. self.assertFalse(cal.setSolarDate(2017, 6, 24.5)) def test_valid_boundary_dates_accepted(self): cal = KoreanLunarCalendar() self.assertTrue(cal.setLunarDate(1000, 1, 1, False)) self.assertTrue(cal.setSolarDate(2050, 12, 31)) self.assertTrue(cal.setSolarDate(1582, 10, 4)) # day just before the gap self.assertTrue(cal.setSolarDate(1582, 10, 15)) # day just after the gap self.assertTrue(cal.setLunarDate(2017, 5, 1, True)) # real leap month if __name__ == "__main__": unittest.main()