mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/welcome/hacktricks-values-and-faq.md'] to hi
This commit is contained in:
parent
9953166513
commit
f741731319
@ -1,21 +1,21 @@
|
||||
# HackTricks मान और अक्सर पूछे जाने वाले प्रश्न
|
||||
# HackTricks के मूल्य और FAQ
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## HackTricks Values
|
||||
## HackTricks के मूल्य
|
||||
|
||||
> [!TIP]
|
||||
> ये HackTricks Project के **मूल्य** हैं:
|
||||
> ये HackTricks प्रोजेक्ट के **मूल्य** हैं:
|
||||
>
|
||||
> - पूरे Internet को **FREE** access दें शैक्षिक hacking संसाधनों तक।
|
||||
> - Hacking सीखना है, और सीखना यथासंभव मुफ्त होना चाहिए।
|
||||
> - इस किताब का उद्देश्य एक व्यापक **शैक्षिक संसाधन** के रूप में सेवा करना है।
|
||||
> - **STORE** शानदार **hacking** techniques जो समुदाय प्रकाशित करता है और मूल **ORIGINAL** **AUTHORS** को सभी **credits** देना।
|
||||
> - **हमें अन्य लोगों से credit नहीं चाहिए**, हम बस सभी के लिए कूल tricks को स्टोर करना चाहते हैं।
|
||||
> - हम HackTricks में **अपने खुद के शोध** भी लिखते हैं।
|
||||
> - कई मामलों में हम सिर्फ technique के महत्वपूर्ण हिस्सों का **HackTricks में सारांश** लिखेंगे और अधिक विवरण के लिए पाठक को **original post पर जाने के लिए प्रोत्साहित करेंगे**।
|
||||
> - किताब में सभी hacking techniques को **ORGANIZE** करें ताकि यह **MORE ACCESSIBLE** हो
|
||||
> - HackTricks टीम ने सिर्फ सामग्री को व्यवस्थित करने के लिए मुफ्त में हजारों घंटे समर्पित किए हैं ताकि लोग **तेजी से सीख सकें**
|
||||
> - पूरे इंटरनेट को **FREE** **EDUCATIONAL hacking** संसाधनों तक उपलब्ध कराना।
|
||||
> - Hacking सीखने के बारे में है, और सीखना जितना संभव हो उतना मुफ़्त होना चाहिए।
|
||||
> - इस पुस्तक का उद्देश्य एक व्यापक **शैक्षिक संसाधन** के रूप में सेवा करना है।
|
||||
> - समुदाय द्वारा प्रकाशित बढ़िया **hacking** तकनीकों को संग्रहीत करना और **ORIGINAL AUTHORS** को पूरा **क्रेडिट** देना।
|
||||
> - **हम दूसरों का क्रेडिट नहीं चाहते**, हम बस सभी के लिए बढ़िया ट्रिक्स सहेजना चाहते हैं।
|
||||
> - हम HackTricks में अपने **खुद के रिसर्च** भी लिखते हैं।
|
||||
> - कई मामलों में हम सिर्फ़ तकनीक के महत्वपूर्ण हिस्सों का **सारांश HackTricks में लिखेंगे** और पाठक को और विवरण के लिए **original post** पर जाने के लिए प्रोत्साहित करेंगे।
|
||||
> - किताब में सभी **hacking** तकनीकों को **व्यवस्थित** करना ताकि यह **अधिक सुलभ** हो।
|
||||
> - HackTricks टीम ने कंटेंट को सिर्फ़ व्यवस्थित करने के लिए हज़ारों घंटे निःशुल्क समर्पित किए हैं ताकि लोग **तेज़ी से सीख सकें**
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
@ -23,35 +23,35 @@
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Thank you so much for these resources, how can I thank you?**
|
||||
> - **इन संसाधनों के लिए बहुत-बहुत धन्यवाद, मैं आपका धन्यवाद कैसे कर सकता/सकती हूँ?**
|
||||
|
||||
You can publicly thanks HackTricks teams for putting together all these resources publicly in a tweet mentioning [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
|
||||
If you are specially grateful you can also [**sponsor the project here**](https://github.com/sponsors/carlospolop).\
|
||||
And don't forget to **give a star in the Github projects!** (Find the links below).
|
||||
आप सार्वजनिक रूप से HackTricks टीम को इन सभी संसाधनों को सार्वजनिक रूप से इकट्ठा करने के लिए ट्विटर पर [**@hacktricks_live**](https://twitter.com/hacktricks_live) का उल्लेख कर धन्यवाद दे सकते हैं।\
|
||||
यदि आप विशेष रूप से आभारी हैं तो आप [**sponsor the project here**](https://github.com/sponsors/carlospolop) भी कर सकते हैं।\
|
||||
और Github प्रोजेक्ट्स पर **स्टार देना न भूलें!** (नीचे लिंक देंखे).
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **How can I contribute to the project?**
|
||||
> - **मैं प्रोजेक्ट में कैसे योगदान कर सकता/सकती हूँ?**
|
||||
|
||||
You can **share new tips and tricks with the community or fix bugs** you find in the books sending a **Pull Request** to the respective Github pages:
|
||||
आप समुदाय के साथ नए टिप्स और ट्रिक्स साझा कर सकते/सकती हैं या किताबों में मिले बग्स ठीक कर सकते/सकती हैं, इसके लिए संबंधित Github पृष्ठों पर एक **Pull Request** भेजें:
|
||||
|
||||
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
|
||||
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
|
||||
|
||||
Don't forget to **give a star in the Github projects!**
|
||||
Github प्रोजेक्ट्स पर **स्टार देना न भूलें!**
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **Can I copy some content from HackTricks and put it in my blog?**
|
||||
> - **क्या मैं HackTricks से कुछ सामग्री कॉपी करके अपने ब्लॉग पर रख सकता/सकती हूँ?**
|
||||
|
||||
हाँ, आप कर सकते हैं, लेकिन **जिस specific link(s) से सामग्री ली गयी है उन्हें ज़रूर उल्लेख करें।**
|
||||
हाँ, आप रख सकते/सकती हैं, लेकिन **जहाँ से सामग्री ली गई है उन विशिष्ट लिंक(स) का उल्लेख करना न भूलें।**
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **How can I cite a page of HackTricks?**
|
||||
> - **HackTricks के किसी पेज का संदर्भ कैसे दूँ?**
|
||||
|
||||
जब तक उस पृष्ठ(ओं) का लिंक जहाँ से आपने जानकारी ली है दिखाई दे रहा है, यह पर्याप्त है।\
|
||||
If you need a bibtex you can use something like:
|
||||
जब तक आप उस पेज(ओं) का लिंक जहाँ से आपने जानकारी ली है दिखा देते हैं, वह पर्याप्त है।\
|
||||
यदि आपको bibtex चाहिए तो आप कुछ इस तरह इस्तेमाल कर सकते हैं:
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
||||
@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
```
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Can I copy all HackTricks in my blog?**
|
||||
>
|
||||
> **मैं यह पसंद नहीं करूंगा**। यह किसी के भी लिए लाभदायक नहीं होगा क्योंकि सारी सामग्री आधिकारिक HackTricks किताबों में पहले से ही मुफ्त रूप से सार्वजनिक रूप से उपलब्ध है।
|
||||
>
|
||||
> अगर आपको डर है कि यह गायब हो जाएगा, तो बस इसे Github पर fork या डाउनलोड कर लें — जैसा मैंने कहा यह पहले से ही मुफ्त है।
|
||||
> - **क्या मैं अपने ब्लॉग में सभी HackTricks कॉपी कर सकता हूँ?**
|
||||
|
||||
**मैं ऐसा करना पसंद नहीं करूँगा।** यह **किसी के लिए भी फायदेमंद नहीं होगा** क्योंकि आधिकारिक HackTricks पुस्तकों की सारी **सामग्री पहले से ही सार्वजनिक रूप से उपलब्ध** है और वह मुफ्त है।
|
||||
|
||||
यदि आपको डर है कि यह गायब हो जाएगा, तो बस इसे Github पर fork कर लें या डाउनलोड कर लें — जैसा कि मैंने कहा, यह पहले से ही मुफ्त है।
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
|
||||
>
|
||||
> पहली **HackTricks** **value** यह है कि दुनिया भर के सभी लोगों को **मुफ्त** hacking शैक्षिक संसाधन प्रदान करना। HackTricks टीम ने इस सामग्री को देने के लिए **हजारों घंटे** समर्पित किए हैं, फिर से, यह सब **मुफ्त** है।
|
||||
>
|
||||
> अगर आप सोचते हैं कि HackTricks किताबें **commercial purposes** के लिए बनाई गई हैं तो आप **पूरी तरह गलत** हैं।
|
||||
>
|
||||
> हमारे पास sponsors इसलिए हैं क्योंकि, भले ही सारी सामग्री **मुफ्त** हो, हम समुदाय को हमारी कड़ी मेहनत की सराहना करने का विकल्प देना चाहते हैं अगर वे चाहें। इसलिए, हम लोगों को HackTricks को दान करने का विकल्प देते हैं via [**Github sponsors**](https://github.com/sponsors/carlospolop), और **प्रासंगिक साइबरसिक्योरिटी कंपनियाँ** HackTricks को sponsor कर सकती हैं और किताब में कुछ **ads** रख सकती हैं — ये **ads** हमेशा ऐसी जगहों पर रखे जाते हैं जहाँ वे **दिखाई दें** लेकिन अगर कोई पाठक सामग्री पर ध्यान दे रहा हो तो वे सीखने की प्रक्रिया को **प्रभावित न करें**।
|
||||
>
|
||||
> आप HackTricks को ऐसी परेशान करने वाली ads से भरा हुआ नहीं पाएँगे जैसा कि अन्य ब्लॉग्स होते हैं जिनमें HackTricks की तुलना में बहुत कम सामग्री होती है, क्योंकि HackTricks व्यावसायिक उद्देश्यों के लिए नहीं बनाया गया है।
|
||||
> - **आपके पास sponsors क्यों हैं? क्या HackTricks किताबें वाणिज्यिक उद्देश्यों के लिए हैं?**
|
||||
|
||||
पहला **HackTricks** **मूल्य** दुनिया भर के **सभी** लोगों को **मुफ्त** hacking शैक्षिक संसाधन प्रदान करना है। HackTricks टीम ने ये सामग्री प्रदान करने के लिए **हजारों घंटे समर्पित** किए हैं, फिर से, **मुफ्त**।
|
||||
|
||||
यदि आप सोचते हैं कि HackTricks किताबें **वाणिज्यिक उद्देश्यों** के लिए बनाई गई हैं तो आप **पूरी तरह गलत** हैं।
|
||||
|
||||
हमारे पास प्रायोजक इसलिए हैं क्योंकि, भले ही सारी सामग्री मुफ़्त हो, हम समुदाय को हमारी मेहनत की सराहना करने का विकल्प देना चाहते हैं यदि वे चाहें। इसलिए, हम लोगों को HackTricks को दान करने का विकल्प देते हैं via [**Github sponsors**](https://github.com/sponsors/carlospolop), और **प्रासंगिक cybersecurity कंपनियाँ** HackTricks का समर्थन कर सकती हैं और किताब में कुछ ads होने देते हैं, जहाँ ads को ऐसे स्थानों पर रखा जाता है जो उन्हें **दिखने लायक** बनाते हैं पर **सीखने की प्रक्रिया में बाधा नहीं डालते** जब कोई सामग्री पर ध्यान केंद्रित करता है।
|
||||
|
||||
आप HackTricks को ऐसे परेशान करने वाले ads से भरा हुआ नहीं पाएँगे जैसे कई अन्य ब्लॉग होते हैं जिनमें HackTricks की तुलना में बहुत कम सामग्री होती है, क्योंकि HackTricks वाणिज्यिक उद्देश्यों के लिए नहीं बनाई गई है।
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?**
|
||||
>
|
||||
> **हम इसके लिए बहुत खेद व्यक्त करते हैं। ऐसा नहीं होना चाहिए था।** कृपया हमें Github issues, Twitter, Discord... के जरिए बताइए — उस HackTricks पेज का लिंक जिसमें आपकी सामग्री है और आपके ब्लॉग का लिंक और **हम इसे चेक कर के ASAP जोड़ देंगे**।
|
||||
> - **यदि किसी HackTricks पेज का आधार मेरा ब्लॉग पोस्ट है पर उसे संदर्भित नहीं किया गया है तो मुझे क्या करना चाहिए?**
|
||||
|
||||
हमें बहुत खेद है। यह नहीं होना चाहिए था। कृपया हमें Github issues, Twitter, Discord... के माध्यम से बताइए — उस HackTricks पेज का लिंक जिसमें उस सामग्री का उपयोग हुआ है और आपके ब्लॉग का लिंक — **हम इसकी जाँच करेंगे और उसे जल्द से जल्द जोड़ देंगे**।
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if there is content from my blog in HackTricks and I don't want it there?**
|
||||
>
|
||||
> ध्यान दें कि HackTricks में आपके पेज के लिंक होने से:
|
||||
>
|
||||
> - आपका **SEO** बेहतर होता है
|
||||
> - सामग्री **15+ भाषाओं** में अनुवादित होती है जिससे अधिक लोग इस सामग्री तक पहुँच पाते हैं
|
||||
> - **HackTricks लोगों को आपके पेज की जाँच करने के लिए प्रोत्साहित करता है** (कई लोगों ने हमें बताया है कि जब उनका पेज HackTricks में आया तो उन्हें ज्यादा विज़िट्स मिली)
|
||||
>
|
||||
> हालांकि, यदि आप फिर भी चाहते हैं कि आपके ब्लॉग की सामग्री HackTricks से हटाई जाए तो हमें बस बता दें और हम निश्चित रूप से **आपके ब्लॉग के सभी लिंक हटाएंगे**, और उससे जुड़ी कोई भी सामग्री हटा देंगे।
|
||||
> - **यदि HackTricks में मेरे ब्लॉग की सामग्री है और मैं नहीं चाहता कि वह वहां हो तो मुझे क्या करना चाहिए?**
|
||||
|
||||
ध्यान दें कि HackTricks में आपकी पेज के लिंक होने से:
|
||||
|
||||
- आपकी **SEO** में सुधार होता है
|
||||
- यह सामग्री **15+ भाषाओं में अनुवादित** हो जाती है जिससे अधिक लोग इस सामग्री तक पहुँच सकते हैं
|
||||
- **HackTricks प्रोत्साहित** करता है लोगों को कि वे **आपके पेज की जाँच करें** (कई लोगों ने हमें बताया है कि जब उनका पेज HackTricks में शामिल हुआ तो उन्हें अधिक विज़िट मिली)
|
||||
|
||||
हालाँकि, यदि आप फिर भी चाहते हैं कि आपके ब्लॉग की सामग्री HackTricks से हटाई जाए तो बस हमें बताइए और हम निश्चित रूप से **आपके ब्लॉग के सभी लिंक हटाएँगे**, और उससे आधारित कोई भी सामग्री भी हटा दी जाएगी।
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **What should I do if I find copy-pasted content in HackTricks?**
|
||||
>
|
||||
> हम हमेशा **मूल लेखक को पूरा श्रेय** देते हैं। यदि आप ऐसा पेज पाते हैं जिसमें बिना मूल स्रोत के copy-paste की गई सामग्री है, तो हमें बताइए और हम या तो उसे **हटा देंगे**, **टेक्स्ट से पहले लिंक जोड़ देंगे**, या **लिंक जोड़कर उसे पुनःलिखित (rewrite) कर देंगे**।
|
||||
> - **यदि मुझे HackTricks में copy-pasted सामग्री मिलती है तो मुझे क्या करना चाहिए?**
|
||||
|
||||
हम हमेशा **मूल लेखकों को सभी श्रेय** देते हैं। यदि आपको किसी पेज पर बिना मूल स्रोत के copy-pasted सामग्री मिलती है, तो हमें बताइए और हम या तो उसे **हटा देंगे**, या **टेक्स्ट के पहले स्रोत का लिंक जोड़ देंगे**, या **लिंक जोड़ते हुए उसे फिर से लिख देंगे**।
|
||||
|
||||
## LICENSE
|
||||
|
||||
कॉपीराइट © सभी अधिकार सुरक्षित जब तक कि अन्यथा निर्दिष्ट न हो।
|
||||
कॉपीराइट © सभी अधिकार सुरक्षित जब तक अन्यथा निर्दिष्ट न हो।
|
||||
|
||||
#### License Summary:
|
||||
|
||||
- Attribution: आप स्वतंत्र हैं:
|
||||
- Share — सामग्री की किसी भी माध्यम या प्रारूप में प्रतिलिपि और पुनर्वितरण करने के लिए।
|
||||
- Adapt — सामग्री को remix, transform, और उस पर निर्माण करने के लिए।
|
||||
- Share — किसी भी माध्यम या स्वरूप में सामग्री की प्रति बनाना और पुनर्वितरित करना।
|
||||
- Adapt — सामग्री को remix, transform, और build करना।
|
||||
|
||||
#### Additional Terms:
|
||||
|
||||
- Third-Party Content: इस ब्लॉग/किताब के कुछ हिस्सों में अन्य स्रोतों से सामग्री शामिल हो सकती है, जैसे अन्य ब्लॉग्स या प्रकाशनों के अंश। ऐसी सामग्री का उपयोग fair use के सिद्धांतों के तहत या संबंधित कॉपीराइट धारकों की स्पष्ट अनुमति के साथ किया गया है। कृपया तृतीय-पक्ष सामग्री के संबंध में विशिष्ट लाइसेंस जानकारी के लिए मूल स्रोतों को देखें।
|
||||
- Authorship: HackTricks द्वारा मूल रूप से लिखी गई सामग्री इस लाइसेंस की शर्तों के अधीन है। साझा या अनुकूलन करते समय आपसे अनुरोध किया जाता है कि आप इस कार्य को लेखक को श्रेय दें।
|
||||
- Third-Party Content: इस ब्लॉग/किताब के कुछ हिस्सों में अन्य स्रोतों की सामग्री शामिल हो सकती है, जैसे अन्य ब्लॉगों या प्रकाशनों के अंश। ऐसे सामग्री का उपयोग fair use के सिद्धांतों के अंतर्गत या संबंधित कॉपीराइट धारकों की स्पष्ट अनुमति के साथ किया गया है। कृपया तीसरे पक्ष की सामग्री के संबंध में विशिष्ट लाइसेंसिंग जानकारी के लिए मूल स्रोतों को देखें।
|
||||
- Authorship: HackTricks द्वारा मूल रूप से रचित सामग्री इस लाइसेंस के नियमों के अधीन है। आप इस कार्य को साझा या अनुकूलित करने पर लेखक को श्रेय देने के लिए प्रोत्साहित किए जाते हैं।
|
||||
|
||||
#### Exemptions:
|
||||
|
||||
- Commercial Use: इस सामग्री के व्यावसायिक उपयोग के संबंध में पूछताछ के लिए, कृपया मुझसे संपर्क करें।
|
||||
- Commercial Use: इस सामग्री के वाणिज्यिक उपयोग के संबंध में पूछताछ के लिए कृपया मुझसे संपर्क करें।
|
||||
|
||||
यह लाइसेंस सामग्री से संबंधित किसी भी ट्रेडमार्क या ब्रांडिंग अधिकार को प्रदान नहीं करता। इस ब्लॉग/किताब में दिखने वाले सभी ट्रेडमार्क और ब्रांडिंग उनके संबंधित मालिकों की संपत्ति हैं।
|
||||
यह लाइसेंस सामग्री के संबंध में किसी ट्रेडमार्क या ब्रांडिंग अधिकार को प्रदान नहीं करता। इस ब्लॉग/किताब में प्रदर्शित सभी ट्रेडमार्क और ब्रांडिंग संबंधित मालिकों की संपत्ति हैं।
|
||||
|
||||
**HackTricks का उपयोग या पहुँच प्राप्त करके, आप इस लाइसेंस की शर्तों का पालन करने के लिए सहमति देते हैं। यदि आप इन शर्तों से सहमत नहीं हैं, तो कृपया इस वेबसाइट का उपयोग न करें।**
|
||||
**HackTricks तक पहुँचने या उपयोग करने के द्वारा, आप इस लाइसेंस की शर्तों का पालन करने के लिए सहमत होते हैं। यदि आप इन शर्तों से सहमत नहीं हैं, तो कृपया इस वेबसाइट तक पहुँच न करें।**
|
||||
|
||||
## **Disclaimer**
|
||||
|
||||
> [!CAUTION]
|
||||
> यह किताब, 'HackTricks,' केवल शैक्षिक और सूचना प्रयोजनों के लिए है। इस किताब की सामग्री "जैसी है" आधार पर प्रदान की जाती है, और लेखक और प्रकाशक किसी भी प्रकार का, स्पष्ट या निहित, पूर्णता, सटीकता, विश्वसनीयता, उपयुक्तता, या उपलब्धता के बारे में कोई प्रतिनिधित्व या वारंटी नहीं देते। आप इस जानकारी पर जो भी निर्भरता करते हैं वह पूरी तरह आपकी अपनी जिम्मेदारी है।
|
||||
> यह किताब, 'HackTricks,' केवल शैक्षिक और सूचना के उद्देश्यों के लिए है। इस किताब में दी गई जानकारी 'जैसी है' के आधार पर प्रदान की जा रही है, और लेखक तथा प्रकाशक किसी भी प्रकार की स्पष्ट या निहित प्रतिनिधित्व या वारंटी नहीं देते, जैसे जानकारी, उत्पादों, सेवाओं, या संबंधित ग्राफिक्स की पूर्णता, सटीकता, विश्वसनीयता, उपयुक्तता, या उपलब्धता के बारे में। आप जिस जानकारी पर भरोसा करते हैं वह पूरी तरह से आपकी अपनी जिम्मेदारी है।
|
||||
>
|
||||
> लेखक और प्रकाशक किसी भी हानि या नुकसान के लिए उत्तरदायी नहीं होंगे, जिसमें प्रत्यक्ष या परोक्ष, परिणामस्वरूप होने वाला नुकसान या डेटा या लाभ के नुकसान से संबंधित कोई भी हानि शामिल है जो इस किताब के उपयोग से उत्पन्न हो।
|
||||
> लेखक और प्रकाशक किसी भी नुकसान या हानि के लिए उत्तरदायी नहीं होंगे, जिसमें परोक्ष या परिणामस्वरूप होने वाली हानि भी शामिल है, या इस किताब के उपयोग से उत्पन्न डेटा या लाभ की हानि से संबंधित कोई भी हानि या नुकसान।
|
||||
>
|
||||
> इसके अतिरिक्त, इस किताब में वर्णित तकनीकें और सुझाव केवल शैक्षिक और सूचना प्रयोजनों के लिए हैं, और किसी भी अवैध या दुर्भावनापूर्ण गतिविधियों के लिए उपयोग नहीं किए जाने चाहिए। लेखक और प्रकाशक किसी भी अवैध या अनैतिक गतिविधियों का समर्थन या समर्थन नहीं करते, और इस किताब में दी गई जानकारी का कोई भी उपयोग उपयोगकर्ता के अपने जोखिम और विवेक पर है।
|
||||
> इसके अलावा, इस किताब में वर्णित तकनीकें और सुझाव केवल शैक्षिक और सूचना के उद्देश्यों के लिए प्रदान किए गए हैं, और किसी भी अवैध या दुर्भावनापूर्ण गतिविधियों के लिए उपयोग नहीं किए जाने चाहिए। लेखक और प्रकाशक किसी भी अवैध या अनैतिक गतिविधियों का समर्थन या समर्थन नहीं करते, और इस किताब में निहित जानकारी का कोई भी उपयोग उपयोगकर्ता के अपने जोखिम और विवेक पर है।
|
||||
>
|
||||
> उपयोगकर्ता किसी भी कार्रवाई के लिए अकेला जिम्मेदार है जो इस किताब में दी गई जानकारी के आधार पर उठाई जाती है, और किसी भी तकनीक या सुझाव को लागू करने का प्रयास करते समय हमेशा पेशेवर सलाह और सहायता लेनी चाहिए।
|
||||
> उपयोगकर्ता इस किताब में निहित जानकारी के आधार पर की गई किसी भी कार्रवाई के लिए अकेला जिम्मेदार है, और किसी भी तकनीक या सुझाव को लागू करने का प्रयास करते समय हमेशा पेशेवर सलाह और सहायता लेनी चाहिए।
|
||||
>
|
||||
> इस किताब का उपयोग करके, उपयोगकर्ता लेखक और प्रकाशक को किसी भी और सभी दायित्वों और जिम्मेदारियों से मुक्त करने के लिए सहमत होता है जो इस किताब या इसकी सामग्री के उपयोग से होने वाले किसी भी नुकसान, हानि, या क्षति के परिणामस्वरूप हो सकते हैं।
|
||||
> इस किताब का उपयोग करके, उपयोगकर्ता लेखक और प्रकाशक को किसी भी और सभी देयताओं और जिम्मेदारियों से मुक्त करने के लिए सहमत होता है जो इस किताब या इसमें निहित जानकारी के उपयोग से उत्पन्न किसी भी क्षति, हानि, या नुकसान के कारण हो सकते हैं।
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
@ -6,34 +6,63 @@
|
||||
*/
|
||||
|
||||
(() => {
|
||||
"use strict";
|
||||
"use strict";
|
||||
|
||||
/* ───────────── 0. helpers (main thread) ───────────── */
|
||||
const clear = el => { while (el.firstChild) el.removeChild(el.firstChild); };
|
||||
|
||||
/* ───────────── 1. Web‑Worker code ─────────────────── */
|
||||
const workerCode = `
|
||||
self.window = self;
|
||||
self.search = self.search || {};
|
||||
const abs = p => location.origin + p;
|
||||
|
||||
/* 1 — elasticlunr */
|
||||
try { importScripts('https://cdn.jsdelivr.net/npm/elasticlunr@0.9.5/elasticlunr.min.js'); }
|
||||
catch { importScripts(abs('/elasticlunr.min.js')); }
|
||||
|
||||
/* 2 — decompress gzip data */
|
||||
async function decompressGzip(arrayBuffer){
|
||||
if(typeof DecompressionStream !== 'undefined'){
|
||||
/* Modern browsers: use native DecompressionStream */
|
||||
const stream = new Response(arrayBuffer).body.pipeThrough(new DecompressionStream('gzip'));
|
||||
const decompressed = await new Response(stream).arrayBuffer();
|
||||
return new TextDecoder().decode(decompressed);
|
||||
} else {
|
||||
/* Fallback: use pako library */
|
||||
if(typeof pako === 'undefined'){
|
||||
try { importScripts('https://cdn.jsdelivr.net/npm/pako@2.1.0/dist/pako.min.js'); }
|
||||
catch(e){ throw new Error('pako library required for decompression: '+e); }
|
||||
}
|
||||
const uint8Array = new Uint8Array(arrayBuffer);
|
||||
const decompressed = pako.ungzip(uint8Array, {to: 'string'});
|
||||
return decompressed;
|
||||
}
|
||||
}
|
||||
|
||||
/* ───────────── 0. helpers (main thread) ───────────── */
|
||||
const clear = el => { while (el.firstChild) el.removeChild(el.firstChild); };
|
||||
|
||||
/* ───────────── 1. Web‑Worker code ─────────────────── */
|
||||
const workerCode = `
|
||||
self.window = self;
|
||||
self.search = self.search || {};
|
||||
const abs = p => location.origin + p;
|
||||
|
||||
/* 1 — elasticlunr */
|
||||
try { importScripts('https://cdn.jsdelivr.net/npm/elasticlunr@0.9.5/elasticlunr.min.js'); }
|
||||
catch { importScripts(abs('/elasticlunr.min.js')); }
|
||||
|
||||
/* 2 — load a single index (remote → local) */
|
||||
/* 3 — load a single index (remote → local) */
|
||||
async function loadIndex(remote, local, isCloud=false){
|
||||
let rawLoaded = false;
|
||||
if(remote){
|
||||
/* Try ONLY compressed version from GitHub (remote already includes .js.gz) */
|
||||
try {
|
||||
const r = await fetch(remote,{mode:'cors'});
|
||||
if (!r.ok) throw new Error('HTTP '+r.status);
|
||||
importScripts(URL.createObjectURL(new Blob([await r.text()],{type:'application/javascript'})));
|
||||
rawLoaded = true;
|
||||
} catch(e){ console.warn('remote',remote,'failed →',e); }
|
||||
if (r.ok) {
|
||||
const compressed = await r.arrayBuffer();
|
||||
const text = await decompressGzip(compressed);
|
||||
importScripts(URL.createObjectURL(new Blob([text],{type:'application/javascript'})));
|
||||
rawLoaded = true;
|
||||
console.log('Loaded compressed from GitHub:',remote);
|
||||
}
|
||||
} catch(e){ console.warn('compressed GitHub',remote,'failed →',e); }
|
||||
}
|
||||
/* If remote (GitHub) failed, fall back to local uncompressed file */
|
||||
if(!rawLoaded && local){
|
||||
try { importScripts(abs(local)); rawLoaded = true; }
|
||||
try {
|
||||
importScripts(abs(local));
|
||||
rawLoaded = true;
|
||||
console.log('Loaded local fallback:',local);
|
||||
}
|
||||
catch(e){ console.error('local',local,'failed →',e); }
|
||||
}
|
||||
if(!rawLoaded) return null; /* give up on this index */
|
||||
@ -61,151 +90,159 @@
|
||||
|
||||
return local ? loadIndex(null, local, isCloud) : null;
|
||||
}
|
||||
|
||||
let built = [];
|
||||
const MAX = 30, opts = {bool:'AND', expand:true};
|
||||
|
||||
self.onmessage = async ({data}) => {
|
||||
if(data.type === 'init'){
|
||||
const lang = data.lang || 'en';
|
||||
const searchindexBase = 'https://raw.githubusercontent.com/HackTricks-wiki/hacktricks-searchindex/master';
|
||||
|
||||
(async () => {
|
||||
const htmlLang = (document.documentElement.lang || 'en').toLowerCase();
|
||||
const lang = htmlLang.split('-')[0];
|
||||
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
|
||||
const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/releases/download';
|
||||
/* Remote sources are .js.gz (compressed), local fallback is .js (uncompressed) */
|
||||
const mainFilenames = Array.from(new Set(['searchindex-' + lang + '.js.gz', 'searchindex-en.js.gz']));
|
||||
const cloudFilenames = Array.from(new Set(['searchindex-cloud-' + lang + '.js.gz', 'searchindex-cloud-en.js.gz']));
|
||||
|
||||
const mainTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
|
||||
const cloudTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
|
||||
const MAIN_REMOTE_SOURCES = mainFilenames.map(function(filename) { return searchindexBase + '/' + filename; });
|
||||
const CLOUD_REMOTE_SOURCES = cloudFilenames.map(function(filename) { return searchindexBase + '/' + filename; });
|
||||
|
||||
const MAIN_REMOTE_SOURCES = mainTags.map(tag => \`\${mainReleaseBase}/\${tag}/searchindex.js\`);
|
||||
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => \`\${cloudReleaseBase}/\${tag}/searchindex.js\`);
|
||||
|
||||
const indices = [];
|
||||
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main);
|
||||
const cloud= await loadWithFallback(CLOUD_REMOTE_SOURCES, '/searchindex-cloud.js', true ); if(cloud) indices.push(cloud);
|
||||
|
||||
if(!indices.length){ postMessage({ready:false, error:'no-index'}); return; }
|
||||
|
||||
/* build index objects */
|
||||
const built = indices.map(d => ({
|
||||
idx : elasticlunr.Index.load(d.json),
|
||||
urls: d.urls,
|
||||
cloud: d.cloud,
|
||||
base: d.cloud ? 'https://cloud.hacktricks.wiki/' : ''
|
||||
}));
|
||||
|
||||
postMessage({ready:true});
|
||||
const MAX = 30, opts = {bool:'AND', expand:true};
|
||||
|
||||
self.onmessage = ({data:q}) => {
|
||||
if(!q){ postMessage([]); return; }
|
||||
|
||||
const all = [];
|
||||
for(const s of built){
|
||||
const res = s.idx.search(q,opts);
|
||||
if(!res.length) continue;
|
||||
const max = res[0].score || 1;
|
||||
res.forEach(r => {
|
||||
const doc = s.idx.documentStore.getDoc(r.ref);
|
||||
all.push({
|
||||
norm : r.score / max,
|
||||
title: doc.title,
|
||||
body : doc.body,
|
||||
breadcrumbs: doc.breadcrumbs,
|
||||
url : s.base + s.urls[r.ref],
|
||||
cloud: s.cloud
|
||||
const indices = [];
|
||||
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex-book.js', false); if(main) indices.push(main);
|
||||
const cloud= await loadWithFallback(CLOUD_REMOTE_SOURCES, '/searchindex.js', true ); if(cloud) indices.push(cloud);
|
||||
if(!indices.length){ postMessage({ready:false, error:'no-index'}); return; }
|
||||
|
||||
/* build index objects */
|
||||
built = indices.map(d => ({
|
||||
idx : elasticlunr.Index.load(d.json),
|
||||
urls: d.urls,
|
||||
cloud: d.cloud,
|
||||
base: d.cloud ? 'https://cloud.hacktricks.wiki/' : ''
|
||||
}));
|
||||
|
||||
postMessage({ready:true});
|
||||
return;
|
||||
}
|
||||
|
||||
const q = data.query || data;
|
||||
if(!q){ postMessage([]); return; }
|
||||
|
||||
const all = [];
|
||||
for(const s of built){
|
||||
const res = s.idx.search(q,opts);
|
||||
if(!res.length) continue;
|
||||
const max = res[0].score || 1;
|
||||
res.forEach(r => {
|
||||
const doc = s.idx.documentStore.getDoc(r.ref);
|
||||
all.push({
|
||||
norm : r.score / max,
|
||||
title: doc.title,
|
||||
body : doc.body,
|
||||
breadcrumbs: doc.breadcrumbs,
|
||||
url : s.base + s.urls[r.ref],
|
||||
cloud: s.cloud
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
all.sort((a,b)=>b.norm-a.norm);
|
||||
postMessage(all.slice(0,MAX));
|
||||
};
|
||||
})();
|
||||
`;
|
||||
}
|
||||
all.sort((a,b)=>b.norm-a.norm);
|
||||
postMessage(all.slice(0,MAX));
|
||||
};
|
||||
`;
|
||||
|
||||
/* ───────────── 2. spawn worker ───────────── */
|
||||
const worker = new Worker(URL.createObjectURL(new Blob([workerCode],{type:'application/javascript'})));
|
||||
|
||||
/* ───────────── 2.1. initialize worker with language ───────────── */
|
||||
const htmlLang = (document.documentElement.lang || 'en').toLowerCase();
|
||||
const lang = htmlLang.split('-')[0];
|
||||
worker.postMessage({type: 'init', lang: lang});
|
||||
|
||||
/* ───────────── 3. DOM refs ─────────────── */
|
||||
const wrap = document.getElementById('search-wrapper');
|
||||
const bar = document.getElementById('searchbar');
|
||||
const list = document.getElementById('searchresults');
|
||||
const listOut = document.getElementById('searchresults-outer');
|
||||
const header = document.getElementById('searchresults-header');
|
||||
const icon = document.getElementById('search-toggle');
|
||||
|
||||
const READY_ICON = icon.innerHTML;
|
||||
icon.textContent = '⏳';
|
||||
icon.setAttribute('aria-label','Loading search …');
|
||||
icon.setAttribute('title','Search is loading, please wait...');
|
||||
|
||||
/* ───────────── 2. spawn worker ───────────── */
|
||||
const worker = new Worker(URL.createObjectURL(new Blob([workerCode],{type:'application/javascript'})));
|
||||
|
||||
/* ───────────── 3. DOM refs ─────────────── */
|
||||
const wrap = document.getElementById('search-wrapper');
|
||||
const bar = document.getElementById('searchbar');
|
||||
const list = document.getElementById('searchresults');
|
||||
const listOut = document.getElementById('searchresults-outer');
|
||||
const header = document.getElementById('searchresults-header');
|
||||
const icon = document.getElementById('search-toggle');
|
||||
|
||||
const READY_ICON = icon.innerHTML;
|
||||
icon.textContent = '⏳';
|
||||
icon.setAttribute('aria-label','Loading search …');
|
||||
icon.setAttribute('title','Search is loading, please wait...');
|
||||
|
||||
const HOT=83, ESC=27, DOWN=40, UP=38, ENTER=13;
|
||||
let debounce, teaserCount=0;
|
||||
|
||||
/* ───────────── helpers (teaser, metric) ───────────── */
|
||||
const escapeHTML = (()=>{const M={'&':'&','<':'<','>':'>','"':'"','\'':'''};return s=>s.replace(/[&<>'"]/g,c=>M[c]);})();
|
||||
const URL_MARK='highlight';
|
||||
function metric(c,t){return c?`${c} search result${c>1?'s':''} for '${t}':`:`No search results for '${t}'.`;}
|
||||
|
||||
function makeTeaser(body,terms){
|
||||
const stem=w=>elasticlunr.stemmer(w.toLowerCase());
|
||||
const T=terms.map(stem),W_S=40,W_F=8,W_N=2,WIN=30;
|
||||
const W=[],sents=body.toLowerCase().split('. ');
|
||||
let i=0,v=W_F,found=false;
|
||||
sents.forEach(s=>{v=W_F; s.split(' ').forEach(w=>{ if(w){ if(T.some(t=>stem(w).startsWith(t))){v=W_S;found=true;} W.push([w,v,i]); v=W_N;} i+=w.length+1; }); i++;});
|
||||
if(!W.length) return body;
|
||||
const win=Math.min(W.length,WIN);
|
||||
const sums=[W.slice(0,win).reduce((a,[,wt])=>a+wt,0)];
|
||||
for(let k=1;k<=W.length-win;k++) sums[k]=sums[k-1]-W[k-1][1]+W[k+win-1][1];
|
||||
const best=found?sums.lastIndexOf(Math.max(...sums)):0;
|
||||
const out=[]; i=W[best][2];
|
||||
for(let k=best;k<best+win;k++){const [w,wt,pos]=W[k]; if(i<pos){out.push(body.substring(i,pos)); i=pos;} if(wt===W_S) out.push('<em>'); out.push(body.substr(pos,w.length)); if(wt===W_S) out.push('</em>'); i=pos+w.length;}
|
||||
return out.join('');
|
||||
}
|
||||
|
||||
function format(d,terms){
|
||||
const teaser=makeTeaser(escapeHTML(d.body),terms);
|
||||
teaserCount++;
|
||||
const enc=encodeURIComponent(terms.join(' ')).replace(/'/g,'%27');
|
||||
const parts=d.url.split('#'); if(parts.length===1) parts.push('');
|
||||
const abs=d.url.startsWith('http');
|
||||
const href=`${abs?'':path_to_root}${parts[0]}?${URL_MARK}=${enc}#${parts[1]}`;
|
||||
const style=d.cloud?" style=\"color:#1e88e5\"":"";
|
||||
const isCloud=d.cloud?" [Cloud]":" [Book]";
|
||||
return `<a href="${href}" aria-details="teaser_${teaserCount}"${style}>`+
|
||||
`${d.breadcrumbs}${isCloud}<span class="teaser" id="teaser_${teaserCount}" aria-label="Search Result Teaser">${teaser}</span></a>`;
|
||||
}
|
||||
|
||||
/* ───────────── UI control ───────────── */
|
||||
function showUI(s){wrap.classList.toggle('hidden',!s); icon.setAttribute('aria-expanded',s); if(s){window.scrollTo(0,0); bar.focus(); bar.select();} else {listOut.classList.add('hidden'); [...list.children].forEach(li=>li.classList.remove('focus'));}}
|
||||
function blur(){const t=document.createElement('input'); t.style.cssText='position:absolute;opacity:0;'; icon.appendChild(t); t.focus(); t.remove();}
|
||||
|
||||
icon.addEventListener('click',()=>showUI(wrap.classList.contains('hidden')));
|
||||
|
||||
document.addEventListener('keydown',e=>{
|
||||
if(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey) return;
|
||||
const f=/^(?:input|select|textarea)$/i.test(e.target.nodeName);
|
||||
if(e.keyCode===HOT && !f){e.preventDefault(); showUI(true);} else if(e.keyCode===ESC){e.preventDefault(); showUI(false); blur();}
|
||||
else if(e.keyCode===DOWN && document.activeElement===bar){e.preventDefault(); const first=list.firstElementChild; if(first){blur(); first.classList.add('focus');}}
|
||||
else if([DOWN,UP,ENTER].includes(e.keyCode) && document.activeElement!==bar){const cur=list.querySelector('li.focus'); if(!cur) return; e.preventDefault(); if(e.keyCode===DOWN){const nxt=cur.nextElementSibling; if(nxt){cur.classList.remove('focus'); nxt.classList.add('focus');}} else if(e.keyCode===UP){const prv=cur.previousElementSibling; cur.classList.remove('focus'); if(prv){prv.classList.add('focus');} else {bar.focus();}} else {const a=cur.querySelector('a'); if(a) window.location.assign(a.href);}}
|
||||
});
|
||||
|
||||
bar.addEventListener('input',e=>{ clearTimeout(debounce); debounce=setTimeout(()=>worker.postMessage(e.target.value.trim()),120); });
|
||||
|
||||
/* ───────────── worker messages ───────────── */
|
||||
worker.onmessage = ({data}) => {
|
||||
if(data && data.ready!==undefined){
|
||||
if(data.ready){
|
||||
icon.innerHTML=READY_ICON;
|
||||
icon.setAttribute('aria-label','Open search (S)');
|
||||
icon.removeAttribute('title');
|
||||
}
|
||||
else {
|
||||
icon.textContent='❌';
|
||||
icon.setAttribute('aria-label','Search unavailable');
|
||||
icon.setAttribute('title','Search is unavailable');
|
||||
}
|
||||
return;
|
||||
|
||||
const HOT=83, ESC=27, DOWN=40, UP=38, ENTER=13;
|
||||
let debounce, teaserCount=0;
|
||||
|
||||
/* ───────────── helpers (teaser, metric) ───────────── */
|
||||
const escapeHTML = (()=>{const M={'&':'&','<':'<','>':'>','"':'"','\'':'''};return s=>s.replace(/[&<>'"]/g,c=>M[c]);})();
|
||||
const URL_MARK='highlight';
|
||||
function metric(c,t){return c?`${c} search result${c>1?'s':''} for '${t}':`:`No search results for '${t}'.`;}
|
||||
|
||||
function makeTeaser(body,terms){
|
||||
const stem=w=>elasticlunr.stemmer(w.toLowerCase());
|
||||
const T=terms.map(stem),W_S=40,W_F=8,W_N=2,WIN=30;
|
||||
const W=[],sents=body.toLowerCase().split('. ');
|
||||
let i=0,v=W_F,found=false;
|
||||
sents.forEach(s=>{v=W_F; s.split(' ').forEach(w=>{ if(w){ if(T.some(t=>stem(w).startsWith(t))){v=W_S;found=true;} W.push([w,v,i]); v=W_N;} i+=w.length+1; }); i++;});
|
||||
if(!W.length) return body;
|
||||
const win=Math.min(W.length,WIN);
|
||||
const sums=[W.slice(0,win).reduce((a,[,wt])=>a+wt,0)];
|
||||
for(let k=1;k<=W.length-win;k++) sums[k]=sums[k-1]-W[k-1][1]+W[k+win-1][1];
|
||||
const best=found?sums.lastIndexOf(Math.max(...sums)):0;
|
||||
const out=[]; i=W[best][2];
|
||||
for(let k=best;k<best+win;k++){const [w,wt,pos]=W[k]; if(i<pos){out.push(body.substring(i,pos)); i=pos;} if(wt===W_S) out.push('<em>'); out.push(body.substr(pos,w.length)); if(wt===W_S) out.push('</em>'); i=pos+w.length;}
|
||||
return out.join('');
|
||||
}
|
||||
const docs=data, q=bar.value.trim(), terms=q.split(/\s+/).filter(Boolean);
|
||||
header.textContent=metric(docs.length,q);
|
||||
clear(list);
|
||||
docs.forEach(d=>{const li=document.createElement('li'); li.innerHTML=format(d,terms); list.appendChild(li);});
|
||||
listOut.classList.toggle('hidden',!docs.length);
|
||||
};
|
||||
})();
|
||||
|
||||
|
||||
function format(d,terms){
|
||||
const teaser=makeTeaser(escapeHTML(d.body),terms);
|
||||
teaserCount++;
|
||||
const enc=encodeURIComponent(terms.join(' ')).replace(/'/g,'%27');
|
||||
const parts=d.url.split('#'); if(parts.length===1) parts.push('');
|
||||
const abs=d.url.startsWith('http');
|
||||
const href=`${abs?'':path_to_root}${parts[0]}?${URL_MARK}=${enc}#${parts[1]}`;
|
||||
const style=d.cloud?" style=\"color:#1e88e5\"":"";
|
||||
const isCloud=d.cloud?" [Cloud]":" [Book]";
|
||||
return `<a href="${href}" aria-details="teaser_${teaserCount}"${style}>`+
|
||||
`${d.breadcrumbs}${isCloud}<span class="teaser" id="teaser_${teaserCount}" aria-label="Search Result Teaser">${teaser}</span></a>`;
|
||||
}
|
||||
|
||||
/* ───────────── UI control ───────────── */
|
||||
function showUI(s){wrap.classList.toggle('hidden',!s); icon.setAttribute('aria-expanded',s); if(s){window.scrollTo(0,0); bar.focus(); bar.select();} else {listOut.classList.add('hidden'); [...list.children].forEach(li=>li.classList.remove('focus'));}}
|
||||
function blur(){const t=document.createElement('input'); t.style.cssText='position:absolute;opacity:0;'; icon.appendChild(t); t.focus(); t.remove();}
|
||||
|
||||
icon.addEventListener('click',()=>showUI(wrap.classList.contains('hidden')));
|
||||
|
||||
document.addEventListener('keydown',e=>{
|
||||
if(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey) return;
|
||||
const f=/^(?:input|select|textarea)$/i.test(e.target.nodeName);
|
||||
if(e.keyCode===HOT && !f){e.preventDefault(); showUI(true);} else if(e.keyCode===ESC){e.preventDefault(); showUI(false); blur();}
|
||||
else if(e.keyCode===DOWN && document.activeElement===bar){e.preventDefault(); const first=list.firstElementChild; if(first){blur(); first.classList.add('focus');}}
|
||||
else if([DOWN,UP,ENTER].includes(e.keyCode) && document.activeElement!==bar){const cur=list.querySelector('li.focus'); if(!cur) return; e.preventDefault(); if(e.keyCode===DOWN){const nxt=cur.nextElementSibling; if(nxt){cur.classList.remove('focus'); nxt.classList.add('focus');}} else if(e.keyCode===UP){const prv=cur.previousElementSibling; cur.classList.remove('focus'); if(prv){prv.classList.add('focus');} else {bar.focus();}} else {const a=cur.querySelector('a'); if(a) window.location.assign(a.href);}}
|
||||
});
|
||||
|
||||
bar.addEventListener('input',e=>{ clearTimeout(debounce); debounce=setTimeout(()=>worker.postMessage({query: e.target.value.trim()}),120); });
|
||||
|
||||
/* ───────────── worker messages ───────────── */
|
||||
worker.onmessage = ({data}) => {
|
||||
if(data && data.ready!==undefined){
|
||||
if(data.ready){
|
||||
icon.innerHTML=READY_ICON;
|
||||
icon.setAttribute('aria-label','Open search (S)');
|
||||
icon.removeAttribute('title');
|
||||
}
|
||||
else {
|
||||
icon.textContent='❌';
|
||||
icon.setAttribute('aria-label','Search unavailable');
|
||||
icon.setAttribute('title','Search is unavailable');
|
||||
}
|
||||
return;
|
||||
}
|
||||
const docs=data, q=bar.value.trim(), terms=q.split(/\s+/).filter(Boolean);
|
||||
header.textContent=metric(docs.length,q);
|
||||
clear(list);
|
||||
docs.forEach(d=>{const li=document.createElement('li'); li.innerHTML=format(d,terms); list.appendChild(li);});
|
||||
listOut.classList.toggle('hidden',!docs.length);
|
||||
};
|
||||
})();
|
||||
|
Loading…
x
Reference in New Issue
Block a user